This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# 小结
- 哈希表能够在 $O(1)$ 时间内将键 key 映射到值 value,效率非常高。
- 常见的哈希表操作包括查询、添加与删除键值对、遍历键值对等。
- 哈希函数将 key 映射为数组索引(桶),以便访问对应的值 value 。
- 两个不同的 key 可能在经过哈希函数后得到相同的索引,导致查询结果出错,这种现象被称为哈希冲突。
- 缓解哈希冲突的方法主要有扩容哈希表和优化哈希表的表示方法。
- 负载因子定义为哈希表中元素数量除以桶数量,反映了哈希冲突的严重程度,常用作触发哈希表扩容的条件。与数组扩容类似,哈希表扩容操作也会产生较大的开销。
- 链式地址通过将单个元素转化为链表,将所有冲突元素存储在同一个链表中,从而解决哈希冲突。然而,过长的链表会降低查询效率,可以通过将链表转换为 AVL 树或红黑树来改善。
- 开放寻址通过多次探测来解决哈希冲突。线性探测使用固定步长,缺点是不能删除元素且容易产生聚集。多次哈希使用多个哈希函数进行探测,相对线性探测不易产生聚集,但多个哈希函数增加了计算量。
- 不同编程语言采取了不同的哈希表实现策略。例如,Java 的 HashMap 使用链式地址,而 Python 的 Dict 采用开放寻址。