首先,定义符号表(有序)的API:
public class ST<Key extends Comparable<Key>, Value>{ ST() //创建符号表 void put(Key key,Value val) //将键值对存入表中 Value get(Key,key) //获取key相对应的值 void delete(Key,key) //删除键值对 boolean contains(Key,key) //key是否存在 boolean isEmpty() //表是否为空 int size() //当前键值对数量 Key min() //最小键 Key max() //最大键 Key floor(Key key) //小于等于key的最大键 Key ceiling(Key key) //大于等于key的最小键 int rank(Key key) //小于key键的数量 Key select(int k) //排名为k的键 void deleteMin() //删除最小的建 void deleteMax() //删除最大的键 int size(Key lo,Key hi) //[lo...hi]之间键的数量 Iterable<Key> keys(Key lo,Key hi) //[lo...hi]之间的所有键 Iterable<Key> keys() //表中所有键的集合 }
符号表的各种实现的优缺点
使用的数据结构 | 实现 | 优点 | 缺点 |
---|---|---|---|
链表 | SequentialSearchST | 适用于小型问题 | 对于大型符号表很慢 |
有序数组 | BinarySearchST | 最优的查找效率和空间需求,能够进行有序性相关操作 | 插入操作很慢 |
二叉查找树 | BST | 实现简单,能够进行有序性相关操作 | 没有性能上限的保证 链接需要额外空间 |
平衡二叉查找树 | RedBleckBST | 最优的查找和插入效率,能够进行有序性相关操作 | 链接需要额外空间 |
散列表 | SeparateChainHashST LinearProbingHashST | 能够快速地查找和插入常见类型数据 | 需要计算散列 无法进行有序性相关工作 链接和空节点需要额外空间 |
各种符号表实现的渐进性能总结
算法(数据结构) | 最坏情况下查找 | 最坏情况下插入 | 平均情况下查找 | 平均情况下插入 | 内存使用 |
---|---|---|---|---|---|
顺序查询 | N | N | N/2 | N | 48N |
二分查找 | lgN | N | lgN | N/2 | 16N |
二叉树查找 | N | N | 1.39 lgN | 1.39 lgN | 64N |
红黑树查找 | 2lgN | 2lgN | lgN | lgN | 64N |
拉链法 | <lgN | <lgN | N/(2M) | N/M | 48N+32N |
线性探测法 | clgN | clgN | <1.5 | <2.5 | 32N~128N |