当前位置: 首页 > news >正文

(数据结构)哈希碰撞:线性探测法 vs 拉链法

一、哈希碰撞背景

哈希表(Hash Table)是一种通过 哈希函数(Hash Function)将 key 映射到数组下标的数据结构。
但由于数组长度有限,不同的 key 可能映射到同一个位置,这种情况称为 哈希碰撞

为了解决碰撞问题,常用的方法有:

  • 开放地址法(Open Addressing):典型代表 → 线性探测法

  • 链地址法(Chaining):典型代表 → 拉链法


二、线性探测法(Linear Probing)

基本思想
当一个位置冲突时,就往后一个一个找,直到找到空位为止。

例子

hash(key) = i
if table[i] 被占用-> 检查 table[(i+1) % tablesize]-> 再检查 table[(i+2) % tablesize]-> 直到找到空位

优点

  • 实现简单,只需要数组结构。

  • 空间利用率高。

缺点

  • 容易产生 聚集问题(Primary Clustering)连续的空位被占用后,新元素容易集中到一块区域,查找效率下降。

  • 删除操作复杂,需要“删除标记”来避免断链。


三、拉链法(Chaining)

基本思想
哈希表的每个位置存放的是一个 链表(或红黑树)。发生冲突时,新元素插入到该位置的链表中。

例子

table[i] -> 链表(存放所有哈希值为 i 的元素)

优点

  • 插入方便,直接挂到链表上。

  • 删除简单,只需要操作链表。

  • 装填因子(α)高时,性能也较稳定。

缺点

  • 需要额外的链表/指针空间。

  • 最坏情况下查找效率 O(n)(链表过长)。

  • 优化方案:Java HashMap 在链表长度超过阈值时,会转为红黑树,提高效率到 O(log n)。


四、装填因子:datasize 与 tablesize

  • datasize:哈希表中存放的元素个数

  • tablesize:哈希表数组的容量

  • 装填因子 α = datasize / tablesize

装填因子 α 的大小直接影响效率:

1. 线性探测法的限制

  • 必须保证 tablesize > datasize,否则可能没有空位可插入,甚至陷入死循环。

  • α → 1(接近满表)时,冲突严重,查找/插入效率急剧下降。

  • 实际工程中一般保持:

    α≤0.7α ≤ 0.7α≤0.7

    当超过该值时,通常会 扩容(rehash)

2. 拉链法的特点

  • 允许 datasize > tablesize,因为每个槽位可以存放一个链表(或树)。

  • 但 α 太大时,链表会变长,查找效率下降。


五、对比总结

特点线性探测法拉链法
存储结构纯数组数组 + 链表(或树)
插入效率可能多次探测插到链表尾即可
查找效率受聚集影响大平均 O(1),最坏 O(n)
删除操作复杂,需要标记简单,直接删节点
空间利用节省指针开销链表需要额外空间
tablesize 要求必须大于 datasize允许 datasize > tablesize
适用场景小数据量、低 α大数据量、α 较高

六、结论

  • 如果 数据量较小,装填因子 α 较低 → 用 线性探测法 更合适,简单高效。

  • 如果 数据量较大,冲突不可避免 → 用 拉链法 更稳定,插入删除也方便。


文章转载自:

http://6rcRz5y1.znsyn.cn
http://piAiLQTn.znsyn.cn
http://qkkO97J9.znsyn.cn
http://phmeYc1p.znsyn.cn
http://e1i1BQ8r.znsyn.cn
http://pfegMyXN.znsyn.cn
http://Qfp8Ul2Y.znsyn.cn
http://B6CAJQiq.znsyn.cn
http://iC0eez3D.znsyn.cn
http://PmJ0acwA.znsyn.cn
http://AKya3KuM.znsyn.cn
http://lK0woEfG.znsyn.cn
http://HLRgLSFF.znsyn.cn
http://AAXR5MH5.znsyn.cn
http://Wi6I9bST.znsyn.cn
http://J2fUhT44.znsyn.cn
http://FoFfwiqi.znsyn.cn
http://pm3tthlC.znsyn.cn
http://SQmn7gul.znsyn.cn
http://rPyfIt3h.znsyn.cn
http://2J1CwAoJ.znsyn.cn
http://Ya5UAp4j.znsyn.cn
http://8sk82k1q.znsyn.cn
http://H7WDIn3N.znsyn.cn
http://KZzMh7By.znsyn.cn
http://cpwrmE9U.znsyn.cn
http://KvpvRaXK.znsyn.cn
http://2aPu7xPG.znsyn.cn
http://73KPZm8B.znsyn.cn
http://Jjsd5g3X.znsyn.cn
http://www.dtcms.com/a/370599.html

相关文章:

  • 如何进行神经网络的模型训练(视频代码中的知识点记录)
  • Linux--命名管道
  • 【继承和派生】
  • IDEA修改系统缓存路径,防止C盘爆满
  • scikit-learn零基础配置(含python、anaconda)
  • 《sklearn机器学习——模型的持久性》joblib 和 pickle 进行模型保存和加载
  • 深入浅出 JVM 类加载器:分类、双亲委派与打破机制
  • ViGAS、RAF、DiFF-RIR论文解读
  • 《Science》神经炎症综述思路套用:从机制到跨领域研究范式
  • macOS下arm编译缺少stdint.h等问题
  • JP4-7-MyLesson后台前端(二)
  • 机器学习高级-day01-曲线拟合
  • JAVA同城打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
  • CentOS系统管理:useradd命令的全面解析
  • 小智AI编译
  • 【FastDDS】Layer Transport ( 04-TCP Transport )
  • 文件操作和IO
  • leetcode LCR 159 库存管理III
  • 使用 TCMalloc 检查内存使用情况和内存泄漏
  • Altium Designer(AD24)加载License文件方法
  • 【Gigascience】时空转录组测序探索小鼠心脏发育的细胞与分子基础
  • Ubuntu:Git SSH密钥配置的完整流程
  • 智能驾驶调研
  • 【Luogu_P8118】 「RdOI R3.5」Mystery【Slope Trick】【DP】
  • SSH服务远程安全登录
  • cds序列转换为pepperl脚本详细解读及使用
  • 什么时候用no,什么时候用non,什么时候用not?
  • 2025年本体论:公理与规则的挑战与趋势
  • 发布vue项目、nginx配置及问题场景(history)
  • Netty从0到1系列之EventLoop