散列查找
1 散列表
1.1 散列的基本思路
定义1个变量n
要使用n就要判断这个变量是否定义过,什么类型,能不能这样用
定义的指针变量就不能*2
查找树,AVL树,但不能完成对变量管理
字符串要一个一个字符的比较
半序:某些数之间存在顺序,比如查找树
1.2 什么是散列表
二维数组,但只能解决1个元素冲突
2 散列函数的构造方法
2.1 数字关键词的散列函数的构造方法
观察可知,第6、10、14、16、17、18位比较随机,所以取这几位出来组成
任意取中间的几位,不能取最后一位,因为最后一位受乘数的最后一位影响
2.2 字符串关键词的散列函数的构造方法
ASSCII值为0-127
假设变量有10位,变量名组合很多,很容易就会使和相同,就会造成冲突
为什么会是27?因为26个字母,还可能会有空格
x*32相当于x<<5
2.3 冲突处理方法
2.3.1 开放地址法(Open Addressing)
线性探测(Linear Probing)
注意30,多次冲突
反过来后,冲突的值就变了
ASLs :key值的冲突次数
- 查找11,冲突0次
- 查找30,冲突6次
.。。。
ASLu : - 求余得0,需要比较3次,即H(key)=0,1,2,H(key)=2时没有值才停止
平方探测法(Quadratic Probing)—— 二次探测
平方探测法避免了线性探测法聚集的现象
平方探测法的实现
希望表的大小为素数,所以使用NextPrime(TableSize),比如TableSize为12,就找一个素数13
对每个元素做一个标记,表示该元素的状态(empty,delete,…)
双散列探测法
再散列
例如:当把mod的值11换为23后,所有散列值(散列地址)都要重新计算
2.3.2 分离链接法(Separate Chaining)
2.4 散列表的性能分析
2.4.1 线性探测法的查找性能
2.4.2 平方探测法和双散列探测法的查找性能
2.4.3 分离链接法的查找性能
2.4.4 散列表性质
2.4.5 开放地址法与分离链接法
2.5 应用实例:词频统计