采用双重哈希算法后仍存在碰撞问题的解决方法咨询(哈希表大小8)
解决双重哈希的碰撞问题
嘿,我来帮你搞定这个双重哈希的碰撞困境!
首先得指出你当前遇到的核心问题:你选的辅助哈希函数H2(k) = 7 - (k%7)没有满足双重哈希的关键要求——H2(k)必须和哈希表大小m=8互质。比如当k=8时,H2计算结果是6,6和8的最大公约数是2,这不互质,会导致探测序列只能遍历部分槽位,更容易撞车,甚至可能出现死循环(明明表没满却找不到空位置)。
双重哈希的核心规则
要让双重哈希正常工作,必须满足两个条件:
- H2(k)必须与哈希表大小m互质(对于m=8来说,H2必须是奇数:1、3、5、7)
- H2(k)不能为0,否则探测序列永远停在H1(k)的位置,无法找到其他空槽
修正方案:设计合规的H2函数
给你几个可行的H2设计,都能保证和m=8互质:
- 方案1(简单直接):
H2(k) = 2*(k%4) + 1,直接生成1、3、5、7这些奇数,完美适配m=8 - 方案2(基于你原函数修改):
H2(k) = 7 - (k%7) if (7 - (k%7))%2 !=0 else 7 - (k%7) -1,确保结果为奇数 - 方案3:
H2(k) = 1 + (k%7) if (1 + (k%7))%2 !=0 else 1 + (k%7) -1,同样保证返回奇数
用方案1重新模拟插入过程
哈希表大小m=8,H1(k)=k%8,H2(k)=2*(k%4)+1:
- 插入0:H1(0)=0,槽位0为空,直接插入 → 哈希表:
[0, _, _, _, _, _, _, _] - 插入1:H1(1)=1,槽位1为空,直接插入 → 哈希表:
[0, 1, _, _, _, _, _, _] - 插入8:H1(8)=0(已被占用),H2(8)=1。尝试i=1得位置1(被占用),i=2得位置2(空),插入8 → 哈希表:
[0, 1, 8, _, _, _, _, _] - 插入9:H1(9)=1(已被占用),H2(9)=3。尝试i=1得位置4(空),插入9 → 哈希表:
[0, 1, 8, _, 9, _, _, _] - 插入5:H1(5)=5,槽位5为空,直接插入 → 哈希表:
[0, 1, 8, _, 9, 5, _, _] - 插入33:H1(33)=1(已被占用),H2(33)=3。尝试i=1得位置4(被占用),i=2得位置7(空),插入33 → 哈希表:
[0, 1, 8, _, 9, 5, _, 33]
所有元素都成功插入,没有碰撞问题!
如果你坚持用原H2函数
虽然不推荐,但针对当前的元素集合,你可以通过递增探测次数i来解决:插入9时,i=0位置1被占,i=1位置6被8占,i=2时计算(1 + 2*5)%8=11%8=3,槽位3为空,直接插入即可。但这种H2设计在更大的元素集合下容易出现死循环,还是建议换成合规的H2函数。
内容的提问来源于stack exchange,提问作者Abdul Raheem Ghani
相关产品推荐
相关产品推荐

