复习了下散列表(Hash Table),总结如下:
1.直接寻址表
直接送数组进行对应,但是当要存储的关键字集合K相对于域U很小时,就会很浪费空间。
2.散列表
利用Hash函数进行映射
“碰撞”发生时,利用链接法解决
3.散列函数的选择
3.1除法散列表
h(k) = k mod m,m是与2的整数幂不太接近的质数
3.2乘法散列表
h(k) = 【m*(k*A mod 1)】向下取整,其中A最好取0.618.......
3.3全域散列
ha,b(k) = ((a*k + b) mod p) mod m,a属于{1, 2 ..., p-1},b属于{0, 1 ..., p-1},p是质数,k都落在{0, 1, ..., p-1}中,p > m
4.开放寻址法
4.1线性探查
h(k, i) = (h'(k) + i) mod m, 其中i = 0, 1, ..., m-1,但容易造成一次群集,即随着时间的推移,连续被占用的槽不断增加,平均查找时间也随着不断增加。
4.2二次探查
h(k, i) = (h'(k) + c1*i + c2*i2) mod m,其中h'(k)为辅助散列函数,c1和c2为辅助常数,i = 0, 1, ..., m-1,虽比线性探查优化了一点,但会造成二次群集。
4.3双重散列
h(k, i) = (h1(k) + i*h2(k)) mod m,其中h2(k)的值要与表的大小m互质,如我们可以取m为一质数
h1(k) = k mod m,h2(k) = 1 + (k mod m'),m’略小于m,可以取值为m-1.