408真题解析-2010-41-数据结构-散列表

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。

考查知识点
  1. 装填因子公式: \\alpha = \\frac{\\text{表中填入元素个数}}{\\text{散列表长度}}
  2. 散列函数计算
  3. 线性探测法: H_i = (H(key) + i) \\mod m, \\quad i = 0, 1, 2, \\ldots
  4. 查找成功 ASL:所有关键字查找次数之和 / 关键字个数
  5. 查找不成功 ASL:所有散列地址探测到空位置次数之和 / 散列函数取值数
题型特征

给定序列、哈希函数、冲突处理、装填因子 → 建表 + 算 ASL。

易错点
  1. 先算表长 m,再算哈希地址
  2. 线性探测时从 i=0 开始计数(比较 1 次算 1 次)
  3. 查找不成功分母是散列函数模值 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 ,不是哈希函数的模数!)
🔹 插入/查找流程
  1. 计算初始地址 h_0 = H(key)
  2. T\[h_0\] 为空 → 插入 / 查找失败 3.
  3. T\[h_0\] 被占但关键字 ≠ key → 探测 h_1 = (h_0 + 1) \\mod m
  4. 重复步骤 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考查频率 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐

📌 关键区别总结

  1. 开放定址 vs 链地址

    • 开放定址:所有元素存表内,表长 ≥ 元素数, \\alpha \\leq 0.7
    • 链地址:元素可超表长,表长 = 桶数, \\alpha 可 >1
  2. 线性 vs 二次探测

    • 线性: i = 1, 2, 3, \\ldots → 严格顺序
    • 二次: i = 1\^2, -1\^2, 2\^2, -2\^2, \\ldots → 跳跃探测(需 m 为质数且 \\alpha \\leq 0.5
  3. 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
  • 真题锚点: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-数据结构-散列表

说明 :本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书 中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。

相关推荐
Eternity∞2 小时前
数据结构基础
c语言·开发语言·数据结构·学习·vim
今儿敲了吗2 小时前
32| 伐木
数据结构·笔记·学习·算法
网小鱼的学习笔记2 小时前
leetcode24: 两两交换链表中的节点
数据结构·链表
小米4962 小时前
day5:92. 反转链表 II
数据结构·链表
大黄说说2 小时前
解锁 .NET 性能极限:深入解析 Span 与零拷贝内存艺术
java·数据结构·算法
㓗冽2 小时前
纯粹合数(字符串)-基础题100th + 找出质数(字符串)-基础题101th + 翻译字符串(字符串)-基础题102th
数据结构·c++
二年级程序员2 小时前
一篇文章掌握“树”(上)
c语言·数据结构·算法
@insist1233 小时前
软考-软件设计师-数据表示核心考点详解:从进制转换到 IEEE 754 标准
java·数据结构·算法
NGC_66113 小时前
【无标题】
数据结构·算法·排序算法