You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

采用双重哈希算法后仍存在碰撞问题的解决方法咨询(哈希表大小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:

  1. 插入0:H1(0)=0,槽位0为空,直接插入 → 哈希表:[0, _, _, _, _, _, _, _]
  2. 插入1:H1(1)=1,槽位1为空,直接插入 → 哈希表:[0, 1, _, _, _, _, _, _]
  3. 插入8:H1(8)=0(已被占用),H2(8)=1。尝试i=1得位置1(被占用),i=2得位置2(空),插入8 → 哈希表:[0, 1, 8, _, _, _, _, _]
  4. 插入9:H1(9)=1(已被占用),H2(9)=3。尝试i=1得位置4(空),插入9 → 哈希表:[0, 1, 8, _, 9, _, _, _]
  5. 插入5:H1(5)=5,槽位5为空,直接插入 → 哈希表:[0, 1, 8, _, 9, 5, _, _]
  6. 插入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:10:54