哈希:
就是找一个数据内容和数据存放地址之间的映射关系。
在直接寻址方式下,具有关键字k的元素被存放在了槽k中,
在散列方式下,该元素存放在槽h(k)中,即利用散列函数h计算出槽的位置。
哈希函数的两个问题:
1、哈希函数的选择
2、冲突的解决方式
哈希函数:
1、除法散列法, h(k) = k mod m
将k映射到m个槽中的一个, 其中m一般选择不太接近2的幂次方的素数。
2、乘法散列法,
1. 先将关键字乘上常数A(0<A<1),并且提取kA的小数部分
2. 用m乘以这个小数部分,再向下取整。
A一般取黄金分割比 0.618 (根号5 - 1)/ 2
解决冲突的方法:
-
链表法: 不同键值映射到相同的槽中,就在该槽后用链表链接。
-
开方寻址法:1.线性探查 2. 二次探查 3. 双重散列
线性探查:
h(k, i) = (h'(k) + i) mod m i从0开始,如果被占用,i就加1,直到找到未被占用的槽。
二次探查:
h(k, i) = (h'(k) + C1i + C2i2 ) mod m C1, C2是正的辅助常数, 选择比较苛刻
双重散列:
h(k, i) = [ h1(k) + i*h2(k) ] mod m 用于开放寻址法的最好方法之一