|
|
|
@ -8,12 +8,13 @@ comments: true
|
|
|
|
|
|
|
|
|
|
**哈希冲突会严重影响哈希表的实用性**。试想一下,如果在哈希表中总是查找到错误的结果,那么我们肯定不会继续使用这样的数据结构了。
|
|
|
|
|
|
|
|
|
|
然而,即使我们设计了一个足够好的「哈希函数」,却仍然无法杜绝哈希冲突问题,这是因为:
|
|
|
|
|
!!! question "为什么会出现哈希冲突?"
|
|
|
|
|
|
|
|
|
|
- 哈希表的桶的大小(地址范围)是有限的,只要数据量足够大,理论上一定会出现冲突;
|
|
|
|
|
- 哈希函数很难使键值对完全均匀分布,这也增大了冲突发生的可能性。
|
|
|
|
|
因为 **哈希函数的输入空间往往远大于输出空间**,所以不可避免地会出现多个输入产生相同输出的情况。比如,输入空间是全体整数,输出空间是一个固定大小的桶(数组)的索引范围,那么必定会有多个整数同时映射到一个桶索引。
|
|
|
|
|
|
|
|
|
|
虽然理论上哈希冲突无法避免,但我们仍然可以在数据结构与算法的层面缓解冲突问题,尽量保证哈希表的增删查改操作效率。**常见的哈希冲突的解决方案有「链式地址」和「开放寻址」**。
|
|
|
|
|
虽然理论上哈希冲突难以避免,**但我们仍然可以在数据结构层面上缓解哈希冲突所带来的负面影响**,尽量保证哈希表的增删查改操作效率。
|
|
|
|
|
|
|
|
|
|
常见的哈希冲突的解决方案有「链式地址」和「开放寻址」。
|
|
|
|
|
|
|
|
|
|
## 链式地址
|
|
|
|
|
|
|
|
|
|