1.哈希函数的选择
一个好的哈希函数H需要哪些特点:
1.keys均匀的映射到表的槽内
2.键值的分布特性应该不影响这种均匀性质
选择的策略主要有两种:除法散列法 ,乘法散列法。
(1)除法散列法: 定义hash函数为 h(k) = k mod m
m的原则就是m选为质数且不能太接近2或者10的幂次。
原因:键值的低位可能具有某种分布规律,如果选择2或者10的幂次容易出现冲突。
(2)乘法散列法:设m=2^r, 计算机是w-bit 长的字,然后定义哈希函数是h(k) = (A*k mod 2^w) rsh (w-r)
其中A是一个在(2^w-1, 2^w)范围内的奇数。
我们来分析这个哈希函数(A*k mod 2^w)这一部分就是将乘法得到的结果只取一个字长 ,然后再rsh w-r位,就刚好只保留了最大是m的结果,可以很好的映射到表中。
假设m=2^3, 字长w是7-bit ,考虑那个乘法过程:
这就像一个幸运大转轮一样,将A转k圈,得到最后的一个结果。
这个哈希函数的好处是,最后的取得h(k)实际上和每一位上的k值都相关,而A和2^w这两个数是互质的,所以想象一个轮盘,周长是2幂,A肯定不是周长的倍数,k是转了多少圈,那么最后的h(k)就会有可能落到轮盘的任意位置。
2.开放寻址法
开放寻址法不成功搜索的预期探寻次数:
对于一个开放寻址的哈希表,α=n/m<1,那么一次不成功搜索的预期探寻次数为1/(1-α).
预期探寻次数1/(1-α)是怎样算出来的,如下:
1.首先,查询一个值至少需要1次探寻
2.有n/m的可能性会发生碰撞,我们需要第二次探寻
3.有(n-1)/(m-1)的可能性第二次探寻也发生了碰撞
……
3观察到(n-i)/(m-i)<α i=1,2,3……n
全域哈希,完全哈希
http://www.cnblogs.com/soyscut/p/3396216.html?utm_source=tuicool&utm_medium=referral
http://www.guokr.com/blog/483599/