408真题解析-2010-41-数据结构-散列表
一 真题2010-题号
2010-41.(10分)将关键字序列(7, 8, 30, 11, 18, 9, 14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为 H ( k e y ) = ( k e y × 3 ) m o d 7 H(key)=(key×3)mod 7 H(key)=(key×3)mod 7 ,处理冲突采用线性探测再散列法,要求装填因子为0.7。
1)请画出所构造的散列表;
2)分别计算等概率情况下查找成功和查找不成功的平均查找长度。
二 题目要素解析
核心考点
散列表构造、线性探测法处理冲突、装填因子计算、平均查找长度 ASL。
考查知识点
- 装填因子公式: \\alpha = \\frac{\\text{表中填入元素个数}}{\\text{散列表长度}}
- 散列函数计算
- 线性探测法: H_i = (H(key) + i) \\mod m, \\quad i = 0, 1, 2, \\ldots
- 查找成功 ASL:所有关键字查找次数之和 / 关键字个数
- 查找不成功 ASL:所有散列地址探测到空位置次数之和 / 散列函数取值数
题型特征
给定序列、哈希函数、冲突处理、装填因子 → 建表 + 算 ASL。
易错点
- 先算表长 m,再算哈希地址
- 线性探测时从 i=0 开始计数(比较 1 次算 1 次)
- 查找不成功分母是散列函数模值 m,不是元素个数
大纲 / 教材对应
数据结构 -- 查找 -- 散列表(哈希表)
三 哔哔详解
✅ 步骤1:确定散列表长度
- 关键字数量 n = 7
- 装填因子 \\alpha = 0.7 = \\frac{n}{m} \\rightarrow m = \\frac{7}{0.7} = 10
- 散列表下标范围: 0 \\sim 9 (共10个单元)
✅ 步骤2:逐个插入关键字(线性探测)
关键点 :散列函数结果 h_0 = (key \\times 3) \\mod 7 是初始探测位置,但实际探测在长度为10的表中进行!
即:若 h_0 冲突,则探测 (h_0 + 1) \\mod 10 , (h_0 + 2) \\mod 10 , ...
| 关键字 | h_0 = (key×3) \\mod 7 | 探测过程(模10) | 最终位置 | 查找成功比较次数 |
|---|---|---|---|---|
| 7 | (7×3) mod 7 = 21 mod 7 = 0 | 0(空)→ 插入 | 0 | 1 |
| 8 | (8×3) mod 7 = 24 mod 7 = 3 | 3(空)→ 插入 | 3 | 1 |
| 30 | (30×3) mod 7 = 90 mod 7 = 6(90÷7=12*7=84, 余6) | 6(空)→ 插入 | 6 | 1 |
| 11 | (11×3) mod 7 = 33 mod 7 = 5(33-28=5) | 5(空)→ 插入 | 5 | 1 |
| 18 | (18×3) mod 7 = 54 mod 7 = 5(54-49=5) | 5(占)→ 6(占)→ 7(空) | 7 | 3(探5,6,7) |
| 9 | (9×3) mod 7 = 27 mod 7 = 6(27-21=6) | 6(占)→ 7(占)→ 8(空) | 8 | 3(探6,7,8) |
| 14 | (14×3) mod 7 = 42 mod 7 = 0 | 0(占)→ 1(空)→ 插入 | 1 | 2(探0,1) |
💡 易错警示:
- 散列函数结果 h_0 是 0 - 6,但探测空间是0 - 9(表长10)!
- 线性探测公式: (h_0 + i) \\mod 10 (不是 \\mod 7 !)
✅ 步骤3:绘制散列表
| 地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 关键字 | 7 | 14 | 8 | 11 | 30 | 18 | 9 |
✅ 步骤4:计算平均查找长度(ASL)
(1) 查找成功 ASL - 每个关键字查找成功的比较次数 = 插入时的探测次数(见上表) - \\text{ASL}_{\\text{成功}} = \\frac{1+2+1+1+3+3+1}{7} = \\frac{12}{7} \\approx 1.714
(2) 查找不成功 ASL - 关键原则:对散列函数所有可能输出值(0~6)计算探测次数(因 h_0 \\in {0,1,2,3,4,5,6} ) - 对每个 h_0 \\in {0,1,2,3,4,5,6} ,模拟查找失败过程(直到遇到空单元):
| 探测序列(模10) | 失败位置 | 比较次数 | |
|---|---|---|---|
| 0 | 0(7)→1(14)→2(空) | 2 | 3 |
| 1 | 1(14)→2(空) | 2 | 2 |
| 2 | 2(空) | 2 | 1 |
| 3 | 3(8)→4(空) | 4 | 2 |
| 4 | 4(空) | 4 | 1 |
| 5 | 5(11)→6(30)→7(18)→8(9)→9(空) | 9 | 5 |
| 6 | 6(30)→7(18)→8(9)→9(空) | 9 | 4 |
📌 说明:
-
- h_0 = 0 :探0(有)→1(有)→2(空) → 比较3次
-
- h_0 = 5 :探5(有)→6(有)→7(有)→8(有)→9(空) → 比较5次
-
- 仅考虑 h_0 = 0 到 6 (因散列函数输出范围是0~6)
-
- \\text{ASL}_{\\text{不成功}} = \\frac{3+2+1+2+1+5+4}{7} = \\frac{18}{7} \\approx 2.571
四 参考答案
1)散列表:
| 地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 关键字 | 7 | 14 | --- | 8 | --- | 11 | 30 | 18 | 9 | --- |
2)
-
查找成功 ASL = \\dfrac{12}{7}
-
查找不成功 ASL = \\dfrac{18}{7}
五 强相关知识点
5.1 本题重要知识点
| 概念 | 说明 | 408高频陷阱 |
|---|---|---|
| 装填因子 | \\alpha = \\frac{n}{m} → 求表长 m | 误用 m=7 (混淆模数与表长) |
| 线性探测范围 | 在 表长 m 的空间 中探测(非散列函数模数) | 探测时错误使用 mod 7 |
| ASL不成功 | 对 散列函数所有输出值 计算(本题0~6) | 错误对地址0~9全部计算 |
| 探测终止条件 | 查找失败:遇到空单元即停止 | 继续探测到表尾 |
5.2 线性探测再散列法
一、基本概念
🔹 定义
线性探测再散列法(Linear Probing) 是开放定址法(Open Addressing)中最简单的一种冲突处理策略:
当发生哈希冲突时,顺序检查散列表中下一个相邻位置(模表长),直到找到空单元或匹配关键字。
🔹 探测序列公式
-
H i = ( H ( k e y ) + i ) m o d m , i = 0 , 1 , 2 , ... , m − 1 H_i = (H(key) + i) \mod m, \quad i = 0, 1, 2, \ldots, m-1 Hi=(H(key)+i)modm,i=0,1,2,...,m−1
-
H(key) :初始哈希地址(由给定哈希函数计算)
-
- i :探测次数(从0开始) - m :散列表长度(注意:模的是表长 m ,不是哈希函数的模数!)
🔹 插入/查找流程
- 计算初始地址 h_0 = H(key)
- 若 T\[h_0\] 为空 → 插入 / 查找失败 3.
- 若 T\[h_0\] 被占但关键字 ≠ key → 探测 h_1 = (h_0 + 1) \\mod m
- 重复步骤 2-3,直到找到空位(插入)或匹配项(成功)或遍历全表(失败)
二、性质与特征
| 性质 | 说明 | 408考查意义 |
|---|---|---|
| 聚集现象(Primary Clustering) | 冲突导致连续占用块,使后续冲突更易发生,形成"雪球效应" | 解释ASL增大的根本原因 |
| 空间局部性好 | 连续内存访问,缓存命中率高 | 对比链地址法的指针跳转 |
| 装填因子敏感 | α > 0.7 时性能急剧下降(408要求 α ≤ 0.7) | 计算表长的关键约束 |
| 删除需特殊标记 | 不能直接置空(会截断探测链),需用"删除标记" | 理解开放定址法删除复杂性 |
| 探测路径唯一 | 分析查找失败探测次数的基础 |
三、与其他探测法对比(408核心辨析)
| 特性 | 线性探测 | 二次探测 | 双散列 | 链地址法 |
|---|---|---|---|---|
| 冲突处理 | 开放定址 | 开放定址 | 开放定址 | 链式结构 |
| 探测公式 | (H+i) \\mod m | (H \\pm i\^2) \\mod m | (H_1 + i \\cdot H_2) \\mod m | 头插/尾插链表 |
| 聚集问题 | 一次聚集(严重) | 二次聚集(较轻) | 无聚集 | 无聚集 |
| 空间开销 | 无额外指针 | 无额外指针 | 无额外指针 | 需指针域(≈50%开销) |
| ASL成功 | \\approx \\frac{1}{2}(1+\\frac{1}{1-\\alpha}) | 优于线性 | 最优 | 1+\\frac{\\alpha}{2} |
| ASL不成功 | \\approx \\frac{1}{2}(1+\\frac{1}{(1-\\alpha)\^2}) | 优于线性 | 最优 | 1+\\alpha |
| 408考查频率 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
📌 关键区别总结:
-
开放定址 vs 链地址:
- 开放定址:所有元素存表内,表长 ≥ 元素数, \\alpha \\leq 0.7
- 链地址:元素可超表长,表长 = 桶数, \\alpha 可 >1
-
线性 vs 二次探测:
- 线性: i = 1, 2, 3, \\ldots → 严格顺序
- 二次: i = 1\^2, -1\^2, 2\^2, -2\^2, \\ldots → 跳跃探测(需 m 为质数且 \\alpha \\leq 0.5 )
-
ASL计算差异:
- 开放定址: \\text{ASL}*{\\text{不成功}} 远大于 \\text{ASL}*{\\text{成功}} (因需探完整个簇)
- 链地址: \\text{ASL}*{\\text{不成功}} \\approx \\text{ASL}*{\\text{成功}} (仅多1次指针判断)
六 扩展知识点
七 核心考点
🔥 考点1:散列表构造(★★★★★)
-
关键陷阱:
- 混淆 哈希函数模数 与 表长 m
例: H(key) = key \\mod 7 ,但表长 m = 10 → 探测用 \\mod 10 - 忽略 装填因子求表长: m = \\lceil n / \\alpha \\rceil
- 混淆 哈希函数模数 与 表长 m
-
真题锚点:2010-41、2019-42
🔥 考点2:ASL计算(★★★★★)
| ASL类型 | 计算规则 | 易错点 |
|---|---|---|
| 查找成功 | \\frac{\\sum \\text{每个关键字的探测次数}}{n} | 探测次数 = 插入时比较次数 |
| 查找不成功 | \\frac{\\sum_{h=0}\^{r-1} \\text{从 } h \\text{ 开始探测到空的次数}}{r} ( r = 哈希函数值域大小) | 仅对哈希函数输出值计算 (如 H(key)=key\\mod7 → r=7 ) |
✅ 口诀 :
"成功看插入,不成功看函数值;
函数模几就除几,表长只管探测域!"
🔥 考点3:聚集现象分析(★★★)
- 问题形式 :
"为什么线性探测在高装填因子下效率低?" - 标准答案 :
"因一次聚集(Primary Clustering)导致冲突元素形成连续簇,增加后续探测长度"
八 408考研大纲和教材对应章节
| 项目 | 内容 |
|---|---|
| 408考纲 | "散列表:散列函数、冲突处理(线性探测)、ASL计算" |
| 严蔚敏《数据结构》 | 第9章 9.3节"散列表"(P257-265,ASL计算例题) |
九 考点跟踪
| 年份 | 题号 | 考查内容 | CSDN 参考链接 | VX参考链接 |
|---|---|---|---|---|
| 2010 | 第41题 | 散列表 线性探测 | 408真题解析-2010-41-数据结构-散列表 |
说明 :本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书 中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。