符号表
维基百科
在计算机科学中,符号表是一种用于语言翻译器(例如编译器和解释器)中的数据结构。在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址.
理解
- 我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储其中,然后按照指定的键来搜索并获取这些信息(值)。
- 有时被称为字典
- 有时被称为索引
- 符号表中可能保存很多的键值对,如何实现一张高效的符号表将是一项很有挑战性的任务
成本模型
- 比较的次数(等价性比较或者键的相互比较)
- 在内循环不进行比较(极少)的情况下,统计数组的访问次数
各种实现的优缺点
数据结构 | 实现 | 优点 | 缺点 |
---|---|---|---|
链表(顺序查找) | LinkedSequentialSearchST | 适用小型问题 | 对于大型符号表很慢 |
有序数组(二分查找) | ArrayBinarySearchST | 最优的查找效率和空间需求,能够进行有序性相关的操作 | 插入操作很慢 |
二叉查找树 | BST | 实现简单,能够进行有序性相关的操作 | 没有性能上界的保证,链接需要额外的空间 |
平衡二叉查找树 | RedBlackBST | 最优的查找和插入效率,能够进行有序性相关的操作 | 链接需要额外的空间 |
散列表 | SeparateChainHashST、LinearProbingHashST | 能够快速的查找和插入常见类型的数据 | 需要计算每种类型的数据的散列,无法进行有序性相关的操作,链接和空节点需要额外的空间 |
符号表的基本接口
/**
* 符号表需要实现的接口
* 使用泛型 Key, Value 来明确指定和区分 键 和 值
*/
public interface ISymbolTable<Key, Value> {
/**
* 将键值对存入符号表(如果值为空则将键从表中删除)
* 每个 键 只对应一个值
* 如果 键 已存在于符号表中,新值替代旧值
*
* @param key
* 键
* @param value
* 值
*/
void put(Key key, Value value);
/***
* 获取键 key 的值(如果键 key 不存在则返回 null)
*
* @param key
*