This commit is contained in:
krahets
2023-08-19 22:07:27 +08:00
parent 71c7786f51
commit 2e27ad1680
99 changed files with 283 additions and 283 deletions
+4 -4
View File
@@ -2,7 +2,7 @@
comments: true
---
# 6.2.   哈希冲突
# 6.2   哈希冲突
上节提到,**通常情况下哈希函数的输入空间远大于输出空间**,因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一数组索引。
@@ -13,7 +13,7 @@ comments: true
哈希表的结构改良方法主要包括链式地址和开放寻址。
## 6.2.1.   链式地址
## 6.2.1   链式地址
在原始哈希表中,每个桶仅能存储一个键值对。「链式地址 Separate Chaining」将单个元素转换为链表,将键值对作为链表节点,将所有发生冲突的键值对都存储在同一链表中。
@@ -1152,7 +1152,7 @@ comments: true
当链表很长时,查询效率 $O(n)$ 很差,**此时可以将链表转换为「AVL 树」或「红黑树」**,从而将查询操作的时间复杂度优化至 $O(\log n)$ 。
## 6.2.2.   开放寻址
## 6.2.2   开放寻址
「开放寻址 Open Addressing」不引入额外的数据结构,而是通过“多次探测”来处理哈希冲突,探测方式主要包括线性探测、平方探测、多次哈希等。
@@ -2448,7 +2448,7 @@ comments: true
与线性探测相比,多次哈希方法不易产生聚集,但多个哈希函数会增加额外的计算量。
## 6.2.3.   编程语言的选择
## 6.2.3   编程语言的选择
Java 采用链式地址。自 JDK 1.8 以来,当 HashMap 内数组长度达到 64 且链表长度达到 8 时,链表会被转换为红黑树以提升查找性能。