数据结构与算法之符号表

简介: 数据结构与算法之符号表

符号表简介


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


bec0b16b1df0472fbddc2bd06047e309.png


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


符号表在实际生活中的使用场景是非常广泛的,见下表:


image.png


符号表API设计


结点类:


image.png

符号表:


image.png

符号表实现


// 符号表
public class SymbolTable<Key,Value> {
  //记录首结点
  private Node head;
  //记录符号表中元素的个数
  private int N;
  public SymbolTable() {
    head = new Node(null,null,null);
    N=0;
  }
  //获取符号表中键值对的个数
  public int size(){
    return N;
  }
  //往符号表中插入键值对
  public void put(Key key,Value value){
    //先从符号表中查找键为key的键值对
    Node n = head;
    while(n.next!=null){
      n = n.next;
      if (n.key.equals(key)){
        n.value=value;
        return;
      }
    }
    //符号表中没有键为key的键值对
    Node oldFirst = head.next;
    Node newFirst = new Node(key,value,oldFirst);
    head.next = newFirst;
    //个数+1
    N++;
  }
  //删除符号表中键为key的键值对
  public void delete(Key key){
    Node n = head;
    while(n.next!=null){
      if (n.next.key.equals(key)){
        n.next = n.next.next;
        N--;
        return;
      }
    n = n.next;
    }
  }
  //从符号表中获取key对应的值
  public Value get(Key key){
    Node n = head;
    while(n.next!=null){
      n = n.next;
      if (n.key.equals(key)){
        return n.value;
      }
    }
    return null;
  }
  private class Node{
    //键
    public Key key;
    //值
    public Value value;
    //下一个结点
    public Node next;
    public Node(Key key, Value value, Node next) {
      this.key = key;
      this.value = value;
      this.next = next;
    }
  }
}
//测试类
public class Test {
  public static void main(String[] args) throws Exception {
    SymbolTable<Integer, String> st = new SymbolTable<>();
    st.put(1, "张三");
    st.put(3, "李四");
    st.put(5, "王五");
    System.out.println(st.size());
    st.put(1,"老三");
    System.out.println(st.get(1));
    System.out.println(st.size());
    st.delete(1);
    System.out.println(st.size());
  }
}


有序符号表


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

//有序符号表
public class OrderSymbolTable<Key extends Comparable<Key>,Value> {
  //记录首结点
  private Node head;
  //记录符号表中元素的个数
  private int N;
  public OrderSymbolTable() {
    head = new Node(null,null,null);
    N=0;
  }
  //获取符号表中键值对的个数
  public int size(){
    return N;
  }
  //往符号表中插入键值对
  public void put(Key key,Value value){
    //记录当前结点
    Node 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=value;
      return;
    }
    //3.没有找到相同的key,把新结点插入到curr之前
    Node newNode = new Node(key, value, curr);
    pre.next = newNode;
  }
  //删除符号表中键为key的键值对
  public void delete(Key key){
    Node n = head;
    while(n.next!=null){
      if (n.next.key.equals(key)){
        n.next = n.next.next;
        N--;
        return;
      }
    n = n.next;
    }
  }
  //从符号表中获取key对应的值
  public Value get(Key key){
    Node n = head;
    while(n.next!=null){
      n = n.next;
      if (n.key.equals(key)){
        return n.value;
      }
    }
    return null;
  }
  private class Node{
    //键
    public Key key;
    //值
    public Value value;
    //下一个结点
    public Node next;
    public Node(Key key, Value value, Node next) {
      this.key = key;
      this.value = value;
      this.next = next;
    }
  }
}
//测试代码
public class Test {
  public static void main(String[] args) throws Exception {
    OrderSymbolTable<Integer, String> bt = new OrderSymbolTable<>();
    bt.put(4, "二哈");
    bt.put(3, "张三");
    bt.put(1, "李四");
    bt.put(1, "aa");
    bt.put(5, "王五");
  }
}


目录
相关文章
|
存储 API
数据结构——符号表
数据结构——符号表
数据结构——符号表
|
算法 C# 网络协议
浅谈算法和数据结构: 六 符号表及其基本实现
原文:浅谈算法和数据结构: 六 符号表及其基本实现 前面几篇文章介绍了基本的排序算法,排序通常是查找的前奏操作。从本文开始介绍基本的查找算法。 在介绍查找算法,首先需要了解符号表这一抽象数据结构,本文首先介绍了什么是符号表,以及这一抽象数据结构的的API,然后介绍了两种简单的符号表的实现方式。
1069 0
|
9天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
139 80
|
2天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
5天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
1天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
6天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
28天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
14天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
21天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。