首页 > 编程语言 >数据结构与算法——符号表API设计及有序符号表设计

数据结构与算法——符号表API设计及有序符号表设计

时间:2024-09-02 17:53:49浏览次数:7  
标签:Node 符号表 Key next API key 设计 public


Java学习手册+面试指南:https://javaxiaobear.cn

符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。

符号表中,键具有唯一性。

符号表的应用:

应用

查找目的



字典

找出单词的释义

单词

释义

图书索引

找出某个术语相关的页码

术语

一串页码

网络搜索

找出某个关键字对应的网页

关键字

网页名称

1、符号表的API设计

  • 节点类

类名

Node<Key,Value>

构造方法

Node(Key key,Value value,Node next):创建Node对象

成员变量

1.public Key key:存储键

2.public Value value:存储值

3.public Node next:存储下一个结点

  • 符号表

类名

SymbolTable<Key,Value>

构造方法

SymbolTable():创建SymbolTable对象

成员方法

1.public Value get(Key key):根据键key,找对应的值

2.public void put(Key key,Value val):向符号表中插入一个键值对

3.public void delete(Key key):删除键为key的键值对

4.public int size():获取符号表的大小

成员变量

1.private Node head:记录首结点

2.private int N:记录符号表中键值对的个数

public class SymbolTable<Key,Value> {
    //头结点
    private Node head;
    //长度
    private int size;


    public SymbolTable() {
        head = new Node(null,null,null);
        size = 0;
    }

    /**
     * :根据键key,找对应的值
     * @param key
     * @return
     */
    public Value get(Key key){
        Node<Key,Value> n = head;
        while(n.next != null){
            n = n.next;
            if(n.key.equals(key)){
                return n.value;
            }
        }
        return null;
    }

    /**
     * 向符号表中插入一个键值对
     * @param key
     * @param val
     */
    public void put(Key key,Value val){
        Node<Key,Value> pre = head;
        while(pre.next != null){
            pre = pre.next;
            if(pre.key.equals(key)){
                pre.value = val;
                return;
            }
        }
        Node oldFirst = head.next;
        Node<Key, Value> node = new Node<>(key, val, oldFirst);
        head.next = node;
        size++;
    }

    /**
     * 删除键为key的键值对<br/>
     * @param key
     */
    public void delete(Key key){
        Node n = head;
        while(null != n.next){
            if(n.next.key.equals(key)){
                n.next = n.next.next;
                size--;
                return;
            }
            n = n.next;
        }
    }

    /**
     * 获取符号表的大小
     * @return
     */
    public int size(){
       return size;
    }


    private class Node<Key,Value>{
        Key key;
        Value value;
        Node next;

        public Node(Key key, Value value, Node next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }
    }
}

2、有序符号表

刚才实现的符号表,我们可以称之为无序符号表,因为在插入的时候,并没有考虑键值对的顺序,而在实际生活中,有时候我们需要根据键的大小进行排序,插入数据时要考虑顺序,那么接下来我们就实现一下有序符号表。

package com.xiaobear.SymbolTable;

/**
 * @Author xiaobear
 * @date 2021年07月30日 10:00
 * @Description 符号表
 */
public class OrderSymbolTable<Key extends Comparable<Key>,Value> {
    //头结点
    private Node head;
    //长度
    private int size;


    public OrderSymbolTable() {
        head = new Node(null,null,null);
        size = 0;
    }

    /**
     * :根据键key,找对应的值
     * @param key
     * @return
     */
    public Value get(Key key){
        Node<Key,Value> n = head;
        while(n.next != null){
            n = n.next;
            if(n.key.equals(key)){
                return n.value;
            }
        }
        return null;
    }

    /**
     * 向符号表中插入一个键值对
     * @param key
     * @param val
     */
    public void put(Key key,Value val){
        Node<Key,Value> curr = head.next;
        //记录上一个节点
        Node pre = head;
        //1.如果key大于当前结点的key,则一直寻找下一个结点
        while(curr!=null && key.compareTo(curr.key)>0){
            pre = curr;
            curr = curr.next;
        }
        //2.如果当前结点curr的key和将要插入的key一样,则替换
        if (curr!=null && curr.key.compareTo(key)==0){
            curr.value = val;
            return;
        }
        //3.没有找到相同的key,把新结点插入到curr之前
        Node newNode = new Node(key, val, curr);
        pre.next = newNode;
        size++;
    }

    /**
     * 删除键为key的键值对<br/>
     * @param key
     */
    public void delete(Key key){
        Node n = head;
        while(null != n.next){
            if(n.next.key.equals(key)){
                n.next = n.next.next;
                size--;
                return;
            }
            n = n.next;
        }
    }

    /**
     * 获取符号表的大小
     * @return
     */
    public int size(){
       return size;
    }


    private class Node<Key,Value>{
        Key key;
        Value value;
        Node next;

        public Node(Key key, Value value, Node next) {
            this.key = key;
            this.value = value;
            this.next = next;
        }
    }
}


数据结构与算法——符号表API设计及有序符号表设计_数据结构与算法

标签:Node,符号表,Key,next,API,key,设计,public
From: https://blog.51cto.com/xiaobear/11899813

相关文章

  • SnailJob:分布式环境设计的任务调度与重试平台!【送源码】
    背景近日挖掘到一款名为“SnailJob”的分布式重试开源项目,它旨在解决微服务架构中常见的重试问题。在微服务大行其道的今天,我们经常需要对某个数据请求进行多次尝试。然而,当遇到网络不稳定、外部服务更新或下游服务负载过高等情况时,请求可能会失败。这时,重试机制就显得尤为重......
  • springboot多媒体内容管理系统-计算机毕业设计源码08580
    摘 要随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个多媒体内容管理系统(CMS)的设计与优化来管理多媒体内容信息,会使管理工作系统化、规范化,提高管理效率。本课题的研究对象是多媒......
  • springboot中小型酒店管理系统-计算机毕业设计源码02793
    摘要随着互联网和移动技术的快速发展,酒店行业也面临着巨大的变革和机遇。传统的酒店管理方式存在着信息不透明、预订流程繁琐等问题,无法满足现代消费者对便捷、高效、个性化服务的需求。因此,开发中小型酒店管理系统具有重要的意义。本文旨在设计和实现一种功能完善、易用且可......
  • 基于python+flask框架的基于web的线上考试管理系统的设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,教育领域正经历着深刻的变革。传统考试模式因其效率低下、管理繁琐且难以适应大规模、远程教学的需求,已逐渐显现出......
  • 【ZYNQ MPSoC开发】lwIP TCP发送用于数据缓存的软件FIFO设计
    设计背景    任务是在ZYNQ的PS上使用裸机运行lwIP协议栈使用TCP把PL端通过AXIDMA传来的将近100K采样率的ADC数据发送出去,但由于数据带宽很大,有853.3mbps,所以在每一次AXIDMA简单传输结束后,lwIP未必有足够的发送buffer立即把数据发送走,如果是发送完再进行下一次简单......
  • 合宙低功耗4G模组Air780EP——硬件设计01
    Air780EP是一款基于移芯EC718P平台设计的LTECat1无线通信模组。支持FDD-LTE/TDD-LTE的4G远距离无线传输技术。另外,模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。本文将主要介绍Air780EP的应用接口设计部分。一、主要性能1.1 Air780EP模块功能框图1.2 型号信......
  • VIN车辆信息查询|阿里云实现调用API接口
    整体请求流程:介绍:本次解析通过阿里云云市场的云服务来实现通过17位车架号来识别到车型的详细信息,比如年份、款式、排放标准等,首先需要准备选择一家可以提供查询的商品。https://market.aliyun.com/apimarket/detail/cmapi00065864#sku=yuncode5986400001步骤1:选择商品如图可申请......
  • springboot基于Hadoop的物品租赁系统的设计与实现
    指南......
  • springboot大学生选修选课系统的设计与实现
    指南......
  • HarmonyOS实战开发:NAPI接口规范开发
    简介NAPI(NativeAPI)组件是一套对外接口基于Node.jsN-API规范开发的原生模块扩展开发框架。图1 NAPI组件架构图NativeEngineJS引擎抽象层,统一JS引擎在NAPI层的接口行为。ModuleManager管理模块,用于模块加载、模块信息缓存。ScopeManager管理NativeValue的生命周......