Skip to content

2010年 408 数据结构 第 41 题

数据结构2010年综合题10分

题目

将关键字序列 ⟨7, 8, 30, 11, 18, 9, 14⟩ 散列存储到散列表中。散列表的存储空间是一个下标从 0 开始的一维数组,散列函数为 H(key) = (key × 3) mod 7,处理冲突采用线性探测再散列法,要求装填(载)因子为 0.7。

(1) 请画出所构造的散列表。

(2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。

解析

预备:算出表长

装填因子 。已填 7 个、,故 表长 m = 10(下标 0..9)。

但散列函数是 ——输出范围是 0..6,不是 0..9。地址 7、8、9 永远不会被 H 直接命中,只能通过线性探测填进去。这是本题的关键陷阱。

(1) 构造散列表

答案:

地址0123456789
关键字71481130189

逐次插入推导

#key探查过程落入
17HT[0] 空0
28HT[3] 空3
330HT[6] 空6
411HT[5] 空5
518HT[5]=11 冲突 → 6=30 冲突 → 7 空7
69HT[6]=30 冲突 → 7=18 冲突 → 8 空8
714HT[0]=7 冲突 → 1 空1

(2) 平均查找长度(成功 + 不成功)

查找成功 ASL

每个关键字的查找比较次数 = 它当时实际探查路径的长度(从 到落入位置):

关键字探查长度
701(直接命中 HT[0])
831
3061
1151
1853(探 5、6、7)
963(探 6、7、8)
1402(探 0、1)

查找不成功 ASL

按"等概率"约定:目标 key 经 H 计算后等概率落在 0..6(散列函数输出范围共 7 个地址)。从每个起始地址 i 出发线性探测,直到遇到一个空槽为止的比较次数(含遇到空槽那一次):

起始地址 i探查序列比较次数
00(7) → 1(14) → 2(空)3
11(14) → 2(空)2
22(空)1
33(8) → 4(空)2
44(空)1
55(11) → 6(30) → 7(18) → 8(9) → 9(空)5
66(30) → 7(18) → 8(9) → 9(空)4

编者注(生僻术语):失败 ASL 的分母用 7(散列函数的输出范围 0..6)而不是 10(表长),因为目标 key 通过 H 后第一次探查只可能落在 0..6 这 7 个地址之一——地址 7、8、9 不会被 H 直接命中。这是本题最容易踩的坑。如果题目改成 H = key mod 10,那分母就是 10。

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数