有关散列表的真题
平均查找长度

[解析]
可以构造得到如下的 HT:
下标 0 1 2 3 4 5 6
关键词 22 43 15
成功时的平均查找长度 = (1+2+3)/3 = 2。

[解析]
构造 散列表 只有当遇到关键字为空的地址时才会查找失败,key%7 之后,初始地址只可能在 0~6,所以即 0~6 到空地址的距离求平均,即为查找失败的平均查找长度初始地址是 0 的失败查找长度为 9,同理得初始地址为 1,2,3,4,5,6 的失败查找长度为 8,7,6,5,4,3,(9+8+7+6+5+4+3)/7 = 6 答案是 C。

概念相关
T1

[解析]
哈希表 的查找效率取决于散列函数、处理冲突的方法和装填因子。显然,冲突的产生概率与装填因子(表中记录数与表长之比)的大小成正比,即装填得越满越容易发生冲突,I 错误。II 显然正确。采用合适的处理冲突的方式避免产生聚集现象,也将提高查找效率,例如用拉链法解决冲突时就不存在聚集现象,用线性探测法解决冲突时易引起聚集现象,III 正确。
T2

[解析]
产生堆积现象,即产生了冲突,它对存储效率、散列函数和装填因子均 不会有影响,而 平均查找长度 会因为堆积现象而增大,选 D。
散列表堆积现象是什么?
在哈希表中,不同的键(Key)通过哈希函数计算后,得到的哈希值(即存储地址)集中在表的少数几个位置,导致部分桶(Bucket)非常拥挤,而其他桶几乎为空。
如图,
不同的键(Key) → 通过 哈希函数 → 得到哈希值(存储桶位置)
如果哈希函数不均匀或数据分布不均:
很多键映射到少数桶 → 这些桶非常拥挤
其他桶几乎为空 → 空间利用率不均衡
这就是所谓的 堆积现象(Clustering)
散列表堆积的原因
1.哈希函数设计不合理
2.装载因子过高
3.数据本身分布集中
4.开放寻址方法中的堆积
为什么装填因子会造成堆积,装填因子是指什么?
装填因子 α 越高 → 冲突概率越大 → 堆积现象越严重。
T3

[解析]
三者都会影响:装填因子越大,说明 哈希表 中存储的元素越满,发生冲突的可能性越大,平均查找长度也越大。散列函数、突解决策略会影响发生冲突的可能性。
哈希表的概念
散列表(hash table),也叫 哈希表,是一种常用的数据结构,提供了快速的数据存储和检索操作。它使用一个数组(通常称为 桶 或 槽)来存储数据。为了将数据存储到散列表中,数据项首先与一个 键 关联,然后使用一个 散列函数 将该键转换为数组的索引。这样,通过该键可以快速找到相应的数据项。
散列表的关键性能指标是其 装载因子,通常表示为 λ。装载因子是散列表中当前存储的元素数量与散列表的容量之比。随着装载因子的增加, 散列冲突的可能性也会增加,这可能会降低散列表的性能。
散列表扩容
Q1-什么是扩容?
扩容(Rehashing)是增加散列表容量以容纳更多元素并降低装载因子的过程。以下是扩容的主要步骤:
- 创建一个 更大容量 的新散列表,通常采用指数倍增长策略(如容量翻倍)。
- 遍历旧散列表中的所有元素,使用 新的哈希函数(或调整后的哈希函数)将它们重新插入到新散列表中。
- 释放旧散列表的内存。
扩容会消耗一定时间,尤其当散列表元素较多时开销较大。然而,由于扩容操作不频繁,其时间成本被分摊到每次插入操作中,使得插入的平摊时间复杂度仍为 O(1)。
Q2-为什么要扩容?
当哈希表的装填因子 α = n/m超过阈值(比如 0.7 或 0.75)时冲突概率增加,查询/插入性能下降
扩容可以:减少冲突;保持平均 O(1) 查找效率
Q3-散列表扩容是在原散列表上扩的吗?
不是,哈希地址是由 桶数 m 决定的:
改变桶数后,原元素的哈希位置也会改变
如果不重新哈希,元素会分布错误,查找失败
散列表扩容是新建更大表 + 重新哈希 + 转移元素,而不是在原表基础上直接增加桶。
