Py算法与数据结构

08 哈希法

冲突、拉链、探测、扩容与 Python 容器

对应本节 12 道题。点击题目展开答案和理由,保留此前生成的详细解析。
第 01 题 问题 1

哈希函数和哈希表是什么关系?

参考答案

哈希函数产生哈希值,哈希表用它定位桶或槽并维护记录。

解析

还需要判等、处理冲突和扩容;哈希函数不是完整的表。

第 02 题 问题 2

哈希冲突一定意味着两个键相等吗?

参考答案

不一定。

解析

不同键可能映射到同一个桶;必须继续比较键。

第 03 题 问题 3

容量 5、h(k)=k%5,键 12、7、22 分别进入哪个桶?

参考答案

都进入桶 2。

解析

这是冲突,不代表三条记录只能保留一条。

第 04 题 问题 4

拉链法如何处理冲突?

参考答案

在同桶的链/容器内保存多个键值对,并逐项查键。

解析

查询成本还取决于桶内记录数。

第 05 题 问题 5

开放寻址删除槽后,为什么不能总是直接设为从未使用的空槽?

参考答案

可能截断其他键的探测路径。

解析

通常用删除标记 tombstone,或采用维护探测不变式的其他方案。

第 06 题 问题 6

装载因子 α 如何定义?容量 8、记录 6 条是多少?

参考答案

α=n/m=6/8=0.75。

解析

它反映记录数与桶/槽数量关系;扩容阈值是具体实现的选择。

第 07 题 问题 7

扩容后直接复制旧桶编号,是否通常正确?

参考答案

不正确。

解析

若桶索引依赖新容量,要对键重新计算位置。

第 08 题 问题 8

列表能直接作为 Python dict 的键吗?元组一定能吗?

参考答案

列表不能;元组只有其成员均可哈希时才能。

解析

可变列表不可哈希,包含列表的元组也不可哈希。

第 09 题 问题 9

若 a==b,正确的哈希实现要求 hash(a) 与 hash(b) 有何关系?

参考答案

必须相等。

解析

反过来哈希相等不必键相等;这是一致性规则。

第 10 题 问题 10

把参与哈希/判等的字段在入表后修改,可能有什么问题?

参考答案

后续查找可能无法正确定位原记录。

解析

键在表内应保持哈希和判等语义稳定。

第 11 题 问题 11

dict 的查找复杂度是否永远 O(1)?

参考答案

不是,常规假设下平均 O(1),最坏可 O(n)。

解析

碰撞、键哈希与判等成本都可能影响实际成本。

第 12 题 问题 12

set 与 dict 的主要接口差异是什么?

参考答案

set 保存唯一元素并支持集合运算;dict 保存键到值的映射。

解析

两者都通常要求键/元素可哈希;用途不同。