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

news2024/11/28 7:43:39

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;
        }
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1348995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PiflowX组件-WriteToUpsertKafka

WriteToUpsertKafka组件 组件说明 以upsert方式往Kafka topic中写数据。 计算引擎 flink 有界性 Streaming Upsert Mode 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_h…

QT音频编程实战项目(一)ui搭建和槽函数的完成

第一个类实现播放音乐&#xff0c;第二个类实现歌曲列表&#xff0c;第三个类是播放本地歌曲 上边是歌曲的总时长&#xff0c;下边是当前播放的时长。 所需要的槽函数如上图。 这个是构造函数&#xff1a; …

基于JavaWeb实验室预约管理系统(源码+数据库+文档)

一、项目简介 本项目是一套基于JavaWeb实验室预约管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;e…

OFDM——PAPR减小

文章目录 前言一、PAPR 减小二、MATLAB 仿真1、OFDM 信号的 CCDF①、MATLAB 源码②、仿真结果 2、单载波基带/通频带信号的 PAPR①、MATLAB 源码②、仿真结果 3、时域 OFDM 信号和幅度分布①、MATLAB 源码②、仿真结果 4、Chu 序列和 IEEE802.16e 前导的 PAPR①、MATLAB 源码②…

ToDesk Linux 客户端安装(欧拉系统)

下载链接 下载链接 https://newdl.todesk.com/linux/todesk-v4.3.1.0-x86_64.rpm &#xff08;使用4.3.1.0覆盖安装后&#xff0c;临时密码将会变更&#xff09; 安装命令&#xff1a; sudo rpm -Uvh todesk-v4.3.1.0-x86_64.rpm启动命令&#xff1a; todesk启动命令只能在桌…

算法通关村第二十关-白银挑战图的存储与遍历

大家好我是苏麟, 今天继续聊图 . 与前面的链表、树等相比&#xff0c;图的存储和遍历要复杂非常多 .所以理解就好 , 面试基本不会让写代码的 . 图的类型多、表示方式多&#xff0c;相关算法也很多&#xff0c;实现又过于复杂&#xff0c;多语言实现难度太大了。这些算法一般理…

Ultra ISO 虚拟光驱修改光盘盘符

windows xp 环境 ultra iso 虚拟光驱修改光盘盘符 method 1. 在ultra iso 中 [选项]->[配置]->[虚拟光驱]&#xff0c;在新盘符里选指定盘符 ->[修改] method 2. 打开命令行&#xff0c;进入安装目录&#xff0c;如 "C:\Program Files\UltraISO\drivers"&…

浅析锂电池保护板(BMS)系统设计思路(四)SOC算法-扩展Kalman滤波算法

1 SOC估算方法介绍 电池SOC的估算是电池管理系统的核心&#xff0c;自从动力电池出现以来&#xff0c;各种各样的电池SOC估算方法不断出现。随着电池管理系统的逐渐升级&#xff0c;电池SOC估算方法的效率与精度不断提高&#xff0c;下面将介绍常用几种电池SOC估算方法[1]&…

2023年总结及2024年规划:我们结婚啦

目录 1、回首2023 1.1、生活方面 1.2、工作方面 1.3、学习方面 2、展望2024 2.1、生活方面 2.2、工作方面 2.3、学习方面 2023年最重要的事情当然是我们结婚啦&#xff01; 1、回首2023 1.1、生活方面 今年五一假期&#xff0c;我和对象回老家在双方亲友的见证下完…

HarmonyOS 路由传参

本文 我们来说两个page界面间的数据传递 路由跳转 router.pushUrl 之前我们用了不少了 但是我们只用了它的第一个参数 url 其实他还有个params参数 我们第一个组件可以编写代码如下 import router from ohos.router Entry Component struct Index {build() {Row() {Column() …

ES6之Proxy详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

虚拟专线网络(IP-VPN)

虚拟专线网络(IP-VPN)&#xff0c;因为它的安全性和可靠性。通过亚洲领先的 IP VPN 提供商。享受更高的可管理性和可扩展性&#xff0c;在多个站点之间交付 IP 流量或数据包&#xff0c;拥有亚太地区最大的 IP 骨干网。 1&#xff0c;保证正常运行时间&#xff0c;在网络链路发…

设计模式设计原则——依赖倒置原则(DIP)

DIP&#xff1a;Dependence Inversion Principle 原始定义&#xff1a;High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。 官…

合伙企业有哪些分类

合伙企业分为&#xff1a;普通合伙企业和有限合伙企业。其中&#xff0c;普通合伙企业又包含特殊的普通合伙企业。 1、普通合伙企业由2人以上普通合伙人(没有上限规定)组成。 普通合伙企业中&#xff0c;合伙人对合伙企业债务承担无限连带责任。 特殊的普通合伙企业中&#xf…

docker 在线安装mysql 8.0.21版本

1、拉取mysql 8.0.21版本镜像 2、查看镜像 docker images 3、在宿主机 /usr/local/mysql 下的 conf 文件夹下&#xff0c;创建 my.cnf 文件&#xff0c;并编辑内容 [mysql] default-character-setutf8 [client] port3306 default-character-setutf8 [mysqld] port3306 se…

【基础篇】五、类的双亲委派机制

文章目录 1、双亲委派机制2、Java代码中去主动加载一个类3、“父”加载器4、Q & A5、打破双亲委派机制 1、双亲委派机制 JVM中有多个类加载器&#xff0c;某个类A&#xff0c;到底该由谁去加载 ⇒ 双亲委派机制 该机制的作用&#xff1a; 保证类加载的安全性&#xff1a;避…

VMvare虚拟机中文件夹共享防火墙设置

目录 一、虚拟机jdk及tomcat配置 1.1 JDK配置 1.2 tomcat配置 二、文件夹共享 2.1 为什么需要配置文件夹共享功能 2.2 高级共享和普通共享 三、防火墙设置 入站规则和出站规则 四、思维导图 一、虚拟机jdk及tomcat配置 1.1 JDK配置 (1) 双击jdk &#xff08;2&#xf…

个体诊所软件方案,农村医疗服务站社区门诊电子处方管理系统软件教程

个体诊所软件方案&#xff0c;农村医疗服务站社区门诊电子处方管理系统软件教程 一、软件程序问答 1、处方单软件有病历汇总吗 如下图&#xff0c;软件以 佳易王电子处方软件V17.2版本为例说明 点击 病历汇总统计 按钮&#xff0c; 可以按明细查询或病历汇总查询&#xf…

交通 | 司乘匹配:基于增量成本计算的优化算法

编者按&#xff1a; 司乘匹配是打车服务中一项至关重要的任务&#xff0c;如果这一步做得不够优化&#xff0c;可能导致乘客需要更长的时间才能到达目的地&#xff0c;同时司机的收入也会因此减少。由于司乘匹配是一个持续进行的过程&#xff0c;每一时刻都在不断涌入新的打车…

MD5算法

一、引言 MD5&#xff08;Message-Digest Algorithm 5&#xff09;是一种广泛应用的密码散列算法&#xff0c;由Ronald L. Rivest于1991年提出。MD5算法主要用于对任意长度的消息进行加密&#xff0c;将消息压缩成固定长度的摘要&#xff08;通常为128位&#xff09;。在密码学…