哈希冲突(Hash Collision)是指不同的键(Key)通过哈希函数计算后得到相同的哈希值,从而映射到同一个存储位置。以下是4种主要的解决方案:
1. 链地址法(Separate Chaining / 拉链法)
原理:每个哈希桶(bucket)维护一个链表(或其他数据结构),所有哈希到同一位置的键值对都存储在这个链表中。
优点:
- 实现简单,链表可以动态增长
- 删除操作简单
- 装填因子可以大于1
缺点:
- 需要额外的内存存储指针
- 链表过长时查找效率退化为O(n)

链地址法:每个桶是一个链表,冲突元素依次链接
2. 开放寻址法 - 线性探测(Linear Probing)
原理:当发生冲突时,顺序检查下一个位置((hash(key) + i) % table_size,i=1,2,3…),直到找到空位。
优点:
- 不需要额外的指针存储
- 缓存局部性好(数据连续存储)
缺点:
- 容易产生"聚集"(Clustering)现象
- 删除操作较复杂(需要标记删除)

左图:线性探测按顺序查找下一个空位
3. 开放寻址法 - 二次探测(Quadratic Probing)
原理:当发生冲突时,按二次方间隔探测下一个位置((hash(key) + i²) % table_size,i=1,2,3…)。
优点:
- 缓解了线性探测的"聚集"问题
- 探测步长逐渐增加,分布更均匀
缺点:
- 仍可能存在"二次聚集"
- 表大小必须是质数才能遍历整个表

右图:二次探测按1², 2², 3²…的间隔跳跃查找
4. 开放寻址法 - 双重哈希(Double Hashing)
原理:使用两个哈希函数,当发生冲突时,使用第二个哈希函数计算探测步长:h(key, i) = (h1(key) + i × h2(key)) % table_size。
优点:
- 最大程度减少聚集现象
- 如果h2选择得当,分布最均匀
缺点:
- 计算开销稍大(需要两次哈希计算)
- h2的结果不能为0

双重哈希:使用第二个哈希函数确定探测步长,分布更均匀
总结对比
| 方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 空间复杂度 | 主要缺点 |
|---|---|---|---|---|
| 链地址法 | O(1) | O(n) | O(n) | 需要额外指针空间 |
| 线性探测 | O(1) | O(n) | O(1) | 聚集现象严重 |
| 二次探测 | O(1) | O(n) | O(1) | 二次聚集,需要质数表大小 |
| 双重哈希 | O(1) | O(n) | O(1) | 计算开销较大 |


1162

被折叠的 条评论
为什么被折叠?



