news 2026/1/14 2:44:41

使用链地址法(拉链法)解决哈希冲突时,每个哈希地址对应一个链表,所有哈希到该地址的关键字按链表形式存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用链地址法(拉链法)解决哈希冲突时,每个哈希地址对应一个链表,所有哈希到该地址的关键字按链表形式存储

使用链地址法(拉链法)解决哈希冲突时,每个哈希地址对应一个链表,所有哈希到该地址的关键字按链表形式存储。下面以题目给出的参数进行详细构造和分析。


1. 链地址法构造哈希表

  • 哈希表长度:11(地址从 0 到 10)
  • 哈希函数:H(key) = key mod 11
  • 关键字序列:47, 34, 13, 12, 52, 38, 33, 27, 3

逐个计算哈希地址并插入:

keyH(key) = key mod 11插入位置(链表)
4747 mod 11 = 3地址 3
3434 mod 11 = 1地址 1
1313 mod 11 = 2地址 2
1212 mod 11 = 1地址 1 → 冲突,链入 34 后
5252 mod 11 = 8地址 8
3838 mod 11 = 5地址 5
3333 mod 11 = 0地址 0
2727 mod 11 = 5地址 5 → 冲突,链入 38 后
33 mod 11 = 3地址 3 → 冲突,链入 47 后

最终哈希表结构如下(链表顺序为插入顺序):

地址 0: [33] 地址 1: [34] → [12] 地址 2: [13] 地址 3: [47] → [3] 地址 4: 空 地址 5: [38] → [27] 地址 6: 空 地址 7: 空 地址 8: [52] 地址 9: 空 地址10: 空

2. 成功查找的平均查找长度(ASL)

成功查找:对每个元素查找时,需比较的次数等于其在链表中的位置(从头开始比较)。

  • 地址 0: 33 → 1 次比较
  • 地址 1: 34(第1个)→ 1 次,12(第2个)→ 2 次
  • 地址 2: 13 → 1 次
  • 地址 3: 47(第1个)→ 1 次,3(第2个)→ 2 次
  • 地址 5: 38(第1个)→ 1 次,27(第2个)→ 2 次
  • 地址 8: 52 → 1 次

统计:

  • 1 次比较的元素:33, 34, 13, 47, 38, 52 → 共 6 个
  • 2 次比较的元素:12, 27, 3 → 共 3 个

总比较次数 = 6×1 + 3×2 = 6 + 6 = 12
元素总数 = 9

因此,
ASL = 12 / 9 ≈1.33

注:原题中写 ASL ≈ 1.34 可能是四舍五入误差,正确值为 1.33(即 4/3)


3. 其他哈希冲突解决方法

  • 再哈希法(双重哈希)
    冲突时使用另一个哈希函数重新计算地址,如H_i = (H1(key) + i×H2(key)) mod table_size,直到找到空位。
    ✅ 优点:减少聚集现象(尤其是线性探测导致的“堆积”)
    ❌ 缺点:计算开销大,需多个哈希函数

  • 公共溢出区法
    设主表和一个溢出表(如数组或链表),主表存放无冲突元素,冲突元素统一放入溢出区。
    查找时先查主表,若冲突则查溢出区。
    ✅ 优点:结构清晰,便于管理
    ❌ 缺点:溢出区可能变慢,查找效率下降


4. 哈希表的查找特点

  • 必须使用与插入时相同的哈希函数冲突处理策略来定位地址。
  • 实际查找过程中仍需进行关键字比较(因为哈希值相同不一定关键字相同)。
  • 查找效率用平均查找长度(ASL)衡量。
  • 影响因素:
    • 哈希函数的好坏(是否均匀分布)
    • 冲突处理方法(链地址 vs 开放寻址)
    • 装填因子 α = 元素个数 / 表长(α 越小,冲突越少,性能越好)

使用开放地址法中的线性探测(Linear Probing)处理哈希冲突时,当发生冲突,会顺序向后查找下一个空闲位置,直到找到空槽为止。其基本公式为:

H_i(key) = (H(key) + i) mod m
其中:

  • H(key) = key mod m是初始哈希值
  • i = 0, 1, 2, ..., m-1是探测次数
  • m是哈希表长度(本例中为 11)

📌 参数回顾:

  • 哈希表长度:11(地址 0 ~ 10)
  • 哈希函数:H(key) = key mod 11
  • 关键字序列:47, 34, 13, 12, 52, 38, 33, 27, 3

我们逐个插入,并在线性探测下解决冲突。


🔧 插入过程详解:

keyH(key)探测过程最终位置说明
4747 mod 11 = 3地址 3 空 → 插入3成功
3434 mod 11 = 1地址 1 空 → 插入1成功
1313 mod 11 = 2地址 2 空 → 插入2成功
1212 mod 11 = 1地址 1 已被占 → 检查 2 → 被占 → 检查 3 → 被占 → 检查 44探测 i=3: (1+3)=4,空,插入
5252 mod 11 = 8地址 8 空 → 插入8成功
3838 mod 11 = 5地址 5 空 → 插入5成功
3333 mod 11 = 0地址 0 空 → 插入0成功
2727 mod 11 = 5地址 5 占 → 6 空?是 → 插入6探测 i=1: (5+1)=6
33 mod 11 = 3地址 3 占 → 4 占(12)→ 5 占 → 6 占(27)→ 7 空 → 插入7探测 i=4: (3+4)=7

✅ 构造完成后的哈希表(索引 0~10):

地址012345678910
内容33341347123827352

📊 成功查找的平均查找长度(ASL)

每次查找从初始地址开始探测,直到找到目标元素,比较次数 = 探测次数 + 1(每探一次算一次比较)

key初始地址实际位置探测步数(i)比较次数
473301
341101
132201
1214从1→2→3→4,第3步成功4(检查1,2,3,4)
528801
385501
330001
2756第1次探测成功(5→6)2
337从3→4→5→6→7,共4步5

注意:线性探测中,“比较次数”是指在查找路径上逐个比对关键字的次数。

总比较次数 = 1+1+1+4+1+1+1+2+5 =17
元素个数 = 9

👉 ASL = 17 / 9 ≈1.89


⚠️ 特点与问题

  • 优点:实现简单,缓存友好(连续访问内存)
  • 缺点
    • 容易产生“聚集现象”(如地址1~4连续被占,形成“主集团”)
    • 插入和查找效率随装填因子升高急剧下降
    • 删除操作复杂(不能直接清空,需标记为“已删除”)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/7 19:51:17

LaTeX学术写作辅助:用HunyuanOCR提取参考文献信息

LaTeX学术写作辅助:用HunyuanOCR提取参考文献信息 在撰写论文时,你是否曾为一条条手动输入参考文献而感到疲惫?尤其是当面对一页页双栏排版、字体细小、甚至带有模糊扫描痕迹的PDF截图时,复制粘贴都变得困难重重。更别提那些夹杂着…

作者头像 李华
网站建设 2026/1/7 19:51:13

从GitHub镜像网站获取腾讯混元OCR模型的完整流程解析

从GitHub镜像网站获取腾讯混元OCR模型的完整流程解析 在文档自动化处理需求日益增长的今天,企业对高精度、多语言、端到端的文字识别能力提出了更高要求。传统OCR方案常因检测与识别模块割裂、多语言支持不足、输出非结构化等问题,在复杂场景中频频“翻车…

作者头像 李华
网站建设 2026/1/10 23:13:03

Obsidian插件开发设想:本地OCR识别图片内文字

Obsidian 插件开发设想:本地 OCR 识别图片内文字 在知识工作者的日常中,截图、扫描文档和手写笔记几乎是不可避免的信息来源。无论是从论文中截取一段关键论述,还是拍下会议白板上的草图,这些图像承载着大量有价值的内容——但它们…

作者头像 李华
网站建设 2026/1/7 19:32:20

为什么C++标准花了10年才给std::future加上超时?真相令人深思

第一章:C26 std::future 超时机制的演进背景在现代异步编程中,对任务执行时间的精确控制至关重要。C 标准库中的 std::future 自 C11 引入以来,一直是处理异步操作的核心工具之一。然而,其超时机制长期以来依赖于有限的接口设计&a…

作者头像 李华
网站建设 2026/1/12 6:04:45

模型加载慢?内存暴涨?C++ AIGC加载难题全解析,一文搞定

第一章:C AIGC模型加载的现状与挑战随着生成式人工智能(AIGC)技术的迅猛发展,将预训练模型高效部署至生产环境成为关键环节。C因其高性能和低延迟特性,在推理服务、嵌入式系统和高频计算场景中被广泛用于模型加载与执行…

作者头像 李华
网站建设 2026/1/12 5:18:55

C++网络编程兼容性难题:如何在Windows和Linux间实现无缝迁移?

第一章:C网络编程跨平台兼容性概述在现代软件开发中,C 网络编程常需运行于多种操作系统环境,如 Windows、Linux 和 macOS。实现跨平台兼容性是确保应用程序广泛部署的关键挑战之一。不同系统对套接字(socket)API 的实现…

作者头像 李华