概述
引入
在一般的哈希表中,有一个显著的缺点:无论选择什么样的哈希函数,总存在一条键值输入序列,这条序列中的每一个键值都会被哈希映射到同一个槽中,导致形成的哈希表只是一条链表,效率较低。
首先需要明确,这个问题的产生是由于哈希函数的确定性,如果哈希函数是不定的,则可以解决这个问题。由此引入随机性。
全域哈希表定义
设 U U U为键值的全集, H H H为哈希函数的有限集,哈希表的槽数量为 m m m,若 ∀ x , y ∈ U , x ≠ y , ∣ forall x,yin 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∣,即对于任意两个不同的键对,哈希函数集合中能将其映射到同一个槽的哈希函数数量为哈希函数集合的大小与槽的数量的比值,则该哈希表称为全域哈希表。
全域哈希表分析
在全域哈希表中,两个不同键值碰撞的概率为 1 m frac{1}{m} m1,分析如下:随机从 H H H中选出的哈希函数能使两个不同键值碰撞的数量为 ∣ H ∣ m frac{|H|}{m} m∣H∣,这个数除以哈希函数总数 ∣ H ∣ |H| ∣H∣,即碰撞概率 1 m frac{1}{m} m1
此外,全域哈希表有一个定理:从 H H H中随机选择哈希函数,将 n n n个键放入哈希表中的 m m m个槽中,发生碰撞的总次数的期望值小于填装因子 α = n m alpha=frac{n}{m} α=mn.
证明略,提示如下:可用随机变量证明,证明中需要用到期望的线性性质
全域哈希一种典型构造
首先,哈希表槽数量 m m m需要为质数。将给定键值 k k k转换为r+1位的 m m m进制数,形成一个序列 k 0 k 1 . . . k r k_0k_1...k_r k0k1...kr,同时随机选取一个r+1位的 m m m进制数a= a 0 a 1 . . . a r a_0a_1...a_r a0a1...ar。
哈希函数 h a ( k ) = ∑ i = 0 r ( a i k i ) m o d m h_a(k)=sum_{i=0}^r(a_ik_i)mod m ha(k)=∑i=0r(aiki)modm
对于该哈希函数的全域性,证明如下:
-
假设有两个不同的键 x = x 0 x 1 . . . x r x=x_0x_1...x_r x=x0x1...xr, y = y 0 y 1 . . . y r y=y_0y_1...y_r y=y0y1...yr。首先需要明确一点,两个键至少有一位是不相同的,但是不管哪一位不相同,运算是相同的,具有对称性。不妨假设第0位不相同,其他位置都相同。
-
如果x与y映射到了同一个槽,则有 ∑ i = 0 r ( a i x i ) ≡ ∑ i = 0 r ( a i y i ) ( m o d m ) sum_{i=0}^r(a_ix_i)equivsum_{i=0}^r(a_iy_i)(mod m) ∑i=0r(aixi)≡∑i=0r(aiyi)(modm)
-
即 ∑ i = 0 r ( a i ( x i − y i ) ) ≡ 0 ( m o d m ) sum_{i=0}^r(a_i(x_i-y_i))equiv0(mod m) ∑i=0r(ai(xi−yi))≡0(modm)
-
即 a 0 ( x 0 − y 0 ) ≡ − ∑ i = 1 r ( a i ( x i − y i ) ) ( m o d 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)
-
引入数论中的一个有限域理论:
设 m m m为一个质数, Z m Z_m Zm是对 m m m取余后的整数,对于任意不为0的 z ∈ Z m z∈Z_m z∈Zm,存在唯一的一个 z − 1 ∈ Z m z^{-1}∈Z_m z−1∈Zm,使得 z − 1 ⋅ z ≡ 1 ( m o d m ) z^{-1 }·z≡1 (mod m) z−1⋅z≡1(modm)
- 有 a 0 ≡ ( − ∑ i = 1 r ( a i ( x i − y i ) ) ) ( x 0 − y 0 ) − 1 ( m o d m ) a_0equiv(-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)
- 这个公式表明,如果 a a a的第0位与上述右式同余 m m m,则 x x x和 y y y将被映射到同一个槽中,因为 a 0 a_0 a0的取值为0到m-1,故要使x与y碰撞, a 0 a_0 a0只有一种取值,其他为有m种取值,满足这种条件的 a a a有 m ∗ m ∗ ⋯ ∗ m ⏟ r ∗ 1 begin{matrix} underbrace{ m*m*cdots*m } \ rend{matrix}*1 m∗m∗⋯∗mr∗1个,即 m r m^r mr个,同时需要注意到哈希函数集 H H H的大小为 m r + 1 m^{r+1} mr+1, m r = m r + 1 m m^r=frac{m^{r+1}}{m} mr=mmr+1,证毕,该哈希为全域哈希。
最后
以上就是懦弱口红为你收集整理的【算法笔记】全域哈希表的全部内容,希望文章能够帮你解决【算法笔记】全域哈希表所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复