散列表
概述
散列表(Hash Table)是一种基于哈希函数将键映射到数组位置的数据结构,支持平均 的查找、插入和删除操作。其核心挑战在于冲突处理——当两个不同的键被映射到同一位置时,需要通过链表法或开放寻址法解决。散列表是符号表、数据库索引和缓存的核心实现。
定义
散列表(Hash Table)
散列表使用哈希函数 将来自全域 的键映射到大小为 的数组(桶)中。
两个关键参数:
- 装载因子(load factor):,其中 为已存储元素数
- 哈希函数:将键均匀映射到桶中,理想情况下每个键等概率映射到每个位置
冲突解决方法
链表法(Chaining):每个桶维护一个链表,冲突的元素追加到链表中。
开放寻址法(Open Addressing):冲突时按某种探查序列寻找下一个空桶。常见探查策略:
- 线性探查:
- 二次探查:
- 双重散列:
核心性质
| 性质 | 描述 | 备注 |
|---|---|---|
| 平均查找 | (简单均匀散列假设下) | 取决于装载因子 |
| 最坏查找 | 所有键映射到同一桶 | |
| 插入/删除 | 平均 | 删除在开放寻址法中较复杂 |
| 装载因子 | 越大,冲突越多 | |
| 空间效率 | 链表法可 ,开放寻址法需 | 需要权衡空间和时间 |
性能分析(简单均匀散列假设)
在简单均匀散列假设下(每个键等概率映射到每个位置,且独立):
| 操作 | 链表法 | 开放寻址法 |
|---|---|---|
| 不成功搜索 | ||
| 成功搜索 |
应用场景
- 符号表:编译器中的变量名查找
- 数据库索引:快速定位数据记录
- 缓存实现:LRU 缓存等
- 去重:快速判断元素是否已出现
- 字典/Map:编程语言中的关联数组(Python dict, Java HashMap)