1.散列函数
好的散列函数应满足均匀散列假设。
1.除法散列法
H(k) = k mod m
2.乘法散列法
H(k)= [m(kA mod 1)], 0<A<1, m一般选择2的某次幂
3.全域散列法
全域散列法在执行开始时,就从一组精心设计的函数中,随机地选择一个作为散列函数。
2.开放寻址法
探查序列:线性探查、二次探查、双重探查
1.线性探查
H(k, i)= (h1(k)+i)mod m, i=0,1,2,3,4,……m-1
问题:一次集群。随着连续被占用的槽不断增加,平均查找时间也随之不断增加。连续被占用的槽就会变得越来越长,因而平均查找时间也会越来越大。
2.二次探查
H(k, i) = (h1(k)+c1*I +c2*i^2)mod m
问题:二次集群。如果两个关键字得初始探查位置相同,那么它们得探查序列也是相同的。
3.双重探查
H(k, i)=(h1(k)+i*h2(k)) mod m
H1(k) = k mod m, h2(k) = 1+(k mod m’) , m为素数,m’略小于m(例如m-1)
3.完全散列
采用两级散列方法来设计完全散列方案,在每级上都采用全域散列。
第一级与带链接的散列表基本上是一样的:利用从某一全域散列函数簇中仔细选出一个散列函数h,将n个关键字散列到m个槽中。
采用一个较小的二次散列表,利用精心选择的散列函数hj,可以确保在第二级上不出现冲突。