← Back
Hashing I 哈希 ChatGPT-summarized
Lecture 7 — Hashing(考前速记版)
一、易错点修正(重点)
1. 区分 与
Direct-access table 的操作时间是:
强调的是严格常数时间,而不是宽松的 。
2. 存的是 record,不是 key
定义:
三者关系:
- :完整记录(record)
- :用于查找的键
- :数组中第 个槽位,存的是记录
核心记忆
key 决定位置,位置里存 record
3. chaining 中 ⇒ 查找
负载因子:
不成功查找期望时间:
若 ,则:
4. 有冲突 ≠
反例:
- 插入 2 个 key,但哈希到同一槽
有 collision,但:
正确结论:
- chaining:允许
- open addressing:必须
5. open addressing 删除困难(核心考点)
原因:
- 查找沿 probe sequence 进行
- 遇到 EMPTY 就停止
如果删除时直接设为 EMPTY:
后果
会截断 probe sequence,导致后面的元素”不可达”。
解决方法:
- 使用 tombstone(DELETED 标记)
6. primary clustering 的本质
linear probing:
问题:
- 连续 occupied 区间(cluster)会不断变长
- 新元素更容易插入该区间后面
本质
坏区间自增强
7. 所有复杂度结论都依赖假设
- chaining:simple uniform hashing
- open addressing:uniform hashing
注意
都是分析假设,不是保证成立。
二、核心内容速记
1. 问题背景:Symbol Table
支持操作:
目标:高效按 key 查找
2. Direct-access table
前提:
定义:
优点:
缺点:空间 可能极大(如 64-bit key)
3. Hashing 思想
定义:
作用:将大 key 空间压缩到小表
代价:collision 不可避免
4. Chaining
方法:每个槽位挂链表
负载因子:
复杂度:
5. Hash function 选择原则
要求:
- 均匀分布
- 不受 key 规律性影响
Division method
注意: 不要选成小因子多或接近
Multiplication method
特点:适合计算机实现(快)
6. Open Addressing
特点:
- 所有元素存表内
- 不用链表
探测序列:
要求:覆盖整个表(permutation)
问题:表可能填满;删除困难
7. Probing 方法
Linear Probing
缺点:primary clustering
Double Hashing
要求:
关键点
否则不能遍历全表。
8. Open Addressing 分析(不成功查找的期望探测次数)
问题:在 open addressing 的表中,查一个不存在的 key,平均要探测几个槽?
推导过程:
- 第 1 次探测:一定会做 → 贡献
- 需要第 2 次探测:说明第 1 个槽被占了,概率
- 需要第 3 次探测:前两个槽都被占了,概率
- 依此类推,每次”继续探测”的概率都被 上界约束
因此期望探测次数:
用几何级数求和(前提 ):
所以:
直观理解:
| 期望探测次数 | 含义 | |
|---|---|---|
| 0.5 | 次 | 表半满,很快 |
| 0.9 | 次 | 表快满了,明显变慢 |
| 0.99 | 次 | 几乎填满,性能急剧恶化 |
核心结论
负载因子 越接近 1,查找越慢。实践中 open addressing 通常控制 。
三、最终记忆版(8句)
- Direct-access:
- hashing:压缩 key 空间
- collision:不可避免
- chaining:
- 好 hash:均匀 + 抗规律
- linear probing:cluster 会变长
- double hashing:需要互素
- open addressing 删除必须用 tombstone
相关笔记
- Hashing I 哈希 — 原始课堂笔记
- 第十一章 散列表