引入
在一般的哈希表中,有一个显著的缺点:无论选择什么样的哈希函数,总存在一条键值输入序列,这条序列中的每一个键值都会被哈希映射到同一个槽中,导致形成的哈希表只是一条链表,效率较低。
首先需要明确,这个问题的产生是由于哈希函数的确定性,如果哈希函数是不定的,则可以解决这个问题。由此引入随机性。
全域哈希表定义
设UUU为键值的全集,HHH为哈希函数的有限集,哈希表的槽数量为mmm,若∀x,y∈U,x≠y,∣\forall x,y\in U,x≠y,|∀x,y∈U,x=y,∣{h∣h∈H,h(x)=h(y)h|h∈H,h(x)=h(y)h∣h∈H,h(x)=h(y)}∣=∣H∣m|=\frac{|H|}{m}∣=m∣H∣,即对于任意两个不同的键对,哈希函数集合中能将其映射到同一个槽的哈希函数数量为哈希函数集合的大小与槽的数量的比值,则该哈希表称为全域哈希表。
全域哈希表分析
在全域哈希表中,两个不同键值碰撞的概率为1m\frac{1}{m}m1,分析如下:随机从HHH中选出的哈希函数能使两个不同键值碰撞的数量为∣H∣m\frac{|H|}{m}m∣H∣,这个数除以哈希函数总数∣H∣|H|∣H∣,即碰撞概率1m\frac{1}{m}m1
此外,全域哈希表有一个定理:从HHH中随机选择哈希函数,将nnn个键放入哈希表中的mmm个槽中,发生碰撞的总次数的期望值小于填装因子α=nm\alpha=\frac{n}{m}α=mn.
证明略,提示如下:可用随机变量证明,证明中需要用到期望的线性性质
全域哈希一种典型构造
首先,哈希表槽数量mmm需要为质数。将给定键值kkk转换为r+1位的mmm进制数,形成一个序列k0k1...krk_0k_1...k_rk0k1...kr,同时随机选取一个r+1位的mmm进制数a=a0a1...ara_0a_1...a_ra0a1...ar。
哈希函数ha(k)=∑i=0r(aiki)mod mh_a(k)=\sum_{i=0}^r(a_ik_i)\mod mha(k)=∑i=0r(aiki)modm
对于该哈希函数的全域性,证明如下:
-
假设有两个不同的键x=x0x1...xrx=x_0x_1...x_rx=x0x1...xr,y=y0y1...yry=y_0y_1...y_ry=y0y1...yr。首先需要明确一点,两个键至少有一位是不相同的,但是不管哪一位不相同,运算是相同的,具有对称性。不妨假设第0位不相同,其他位置都相同。
-
如果x与y映射到了同一个槽,则有∑i=0r(aixi)≡∑i=0r(aiyi)(mod m)\sum_{i=0}^r(a_ix_i)\equiv\sum_{i=0}^r(a_iy_i)(\mod m)∑i=0r(aixi)≡∑i=0r(aiyi)(modm)
-
即∑i=0r(ai(xi−yi))≡0(mod m)\sum_{i=0}^r(a_i(x_i-y_i))\equiv0(\mod m)∑i=0r(ai(xi−yi))≡0(modm)
-
即a0(x0−y0)≡−∑i=1r(ai(xi−yi))(mod m)a_0(x_0-y_0)\equiv-\sum_{i=1}^r(a_i(x_i-y_i))(\mod m)a0(x0−y0)≡−∑i=1r(ai(xi−yi))(modm)
-
引入数论中的一个有限域理论:
设mmm为一个质数,ZmZ_mZm是对mmm取余后的整数,对于任意不为0的z∈Zmz∈Z_mz∈Zm,存在唯一的一个z−1∈Zmz^{-1}∈Z_mz−1∈Zm,使得z−1⋅z≡1(mod m)z^{-1 }·z≡1 (\mod m)z−1⋅z≡1(modm)
- 有a0≡(−∑i=1r(ai(xi−yi)))(x0−y0)−1(mod m)a_0\equiv(-\sum_{i=1}^r(a_i(x_i-y_i)))(x_0-y_0)^{-1} (\mod m)a0≡(−∑i=1r(ai(xi−yi)))(x0−y0)−1(modm)
- 这个公式表明,如果aaa的第0位与上述右式同余mmm,则xxx和yyy将被映射到同一个槽中,因为a0a_0a0的取值为0到m-1,故要使x与y碰撞,a0a_0a0只有一种取值,其他为有m种取值,满足这种条件的aaa有m∗m∗⋯∗m⏟r∗1\begin{matrix} \underbrace{ m*m*\cdots*m } \\ r\end{matrix}*1m∗m∗⋯∗mr∗1个,即mrm^rmr个,同时需要注意到哈希函数集HHH的大小为mr+1m^{r+1}mr+1,mr=mr+1mm^r=\frac{m^{r+1}}{m}mr=mmr+1,证毕,该哈希为全域哈希。