哈希表的原理与冲突解决
字数 690 2025-11-02 17:10:18
哈希表的原理与冲突解决
哈希表是一种通过哈希函数将键映射到数组索引,从而实现高效查找的数据结构。其核心思想是将键转换为数组下标,使得查找、插入和删除操作的时间复杂度接近O(1)。
1. 哈希函数
哈希函数是哈希表的核心,负责将任意大小的键转换为固定范围的数组索引。理想的哈希函数应满足:
- 计算速度快
- 分布均匀(减少冲突)
例如,对字符串"key"进行哈希:计算每个字符的ASCII值之和,再对数组大小取模。
2. 哈希冲突
当不同键通过哈希函数得到相同索引时,发生冲突。例如:
- 数组大小:10
- 键"ab"的ASCII和:97+98=195 → 195%10=5
- 键"ba"的ASCII和:98+97=195 → 195%10=5
两者映射到同一索引5。
3. 冲突解决方法
3.1 链地址法
- 每个数组位置维护一个链表(或其他容器)
- 冲突时,将新元素添加到对应位置的链表末尾
- 示例:插入"ab"和"ba"后,索引5的链表包含两个节点
3.2 开放定址法
当冲突发生时,按照某种规则寻找下一个空闲位置:
- 线性探测:顺序检查下一个位置(index+1, index+2...)
- 二次探测:检查index+1², index+2²...避免聚集
- 查找时需沿探测序列逐个比较,直到找到或遇到空位
4. 负载因子与扩容
负载因子 = 元素数量 / 数组大小。当负载因子过高(如>0.75):
- 冲突概率增大,性能下降
- 需创建更大数组,重新哈希所有元素到新位置
5. 时间复杂度分析
- 理想情况(无冲突):O(1)
- 最坏情况(全部冲突):O(n)
- 平均情况(良好哈希函数):O(1)