前言
符号表,一种映射关系,具体实现常用Hash表。很多情况下,现实世界的东西不能在计算机中表示,这时候就需要符号表,它给我们构建了现实世界和计算机世界的桥梁。
常用方法比较
方法 | 平均插入时间 | 平均查找时间 | 平均删除时间 |
---|---|---|---|
链表 | c (保存链表尾部) | n/2 | |
有序线性表 | lnn | lnn (二分查找) | n |
二叉搜索树 | 1.38lnn (未启用删除方法) | n√ (启用删除方法后,插入、查找删除时间全变为 n√ ) | |
红黑树 | lnn | lnn | lnn |
拉链法(数据均匀独立) | [3,5] (说明见下) | [3,5] | [3,5] |
线性探测法(数据均匀独立) | [3,5] (说明见下) | [3,5] | [3,5] |
特殊性
备注:二叉搜索树和红黑树的备注在文章二叉搜索树(Binary Search Tree)
中。
拉链法
为什么平均(插入,查找,删除)的时间是3-5呢?这和散列的范围有关。这里规定数据规模为
n
, 散列过后的表规模为
线性探测法
为什么平均(插入,查找,删除)的时间是3-5呢?我也不清楚。不过散列的规模最好为待散列数组长度的一半。
Java 散列设计规则
- 用 31x+y 进行转换
- 原始类型(primitive type)用包装类型(wrapper type)转换
- 空值转换为 0 <script type="math/tex" id="MathJax-Element-30">0</script>
- 引用类型(reference type)转换为自身对应的hashcode(Java中)
- 如果对象为数组,对其中每一个成员应用上面的规则