Update hash_collision.md

pull/435/head
krahets 2 years ago
parent 3cd724a6d8
commit 8e78c6036b

@ -6,15 +6,15 @@
为了缓解哈希冲突,一方面,**我们可以通过哈希表扩容来减小冲突概率**。极端情况下,当输入空间和输出空间大小相等时,哈希表就等价于数组了,每个 key 都对应唯一的数组索引,可谓“大力出奇迹”。
另一方面,**考虑通过优化哈希表的来缓解哈希冲突**,常见的方法有「链式地址」和「开放寻址」。
另一方面,**考虑通过优化哈希表的表示来缓解哈希冲突**,常见的方法有「链式地址」和「开放寻址」。
## 哈希表扩容
「负载因子 Load Factor」定义为 **哈希表中元素数量除以桶数量(即数组大小)**,代表哈希冲突的严重程度
哈希函数的最后一步往往是对桶数量 $n$ 取余,以将哈希值映射到桶的索引范围,从而将 key 放入对应的桶中。当哈希表容量越大(即 $n$ 越大)时,多个 key 被分配到同一个桶中的概率就越低,冲突就越少
**负载因子常用作哈希表扩容的触发条件**。比如在 Java 中,当负载因子 $> 0.75$ 时则触发扩容,将 HashMap 大小扩充至原先的 $2$ 倍
因此,**在哈希表内的冲突整体比较严重时,编程语言一般通过扩容哈希表来缓解**。与数组扩容类似,哈希表扩容需要将所有键值对从原哈希表移动至新哈希表,**开销很大**
与数组扩容类似,**哈希表扩容操作的开销很大**,因为需要将所有键值对从原哈希表依次移动至新哈希表
编程语言一般使用「负载因子 Load Factor」来评估哈希冲突的严重程度**其定义为哈希表中元素数量除以桶数量**,常用作哈希表扩容的触发条件。比如在 Java 中,当负载因子 $> 0.75$ 时,系统会将 HashMap 容量扩充至原先的 $2$ 倍
## 链式地址

Loading…
Cancel
Save