HashTables如何处理冲突?

2022-08-31 08:57:19

我在学位课程中听说过,如果新密钥条目与另一个密钥条目发生冲突,a会将新条目放入“下一个可用”存储桶中。HashTable

如果在使用碰撞键调用一个冲突时发生此冲突,则仍然如何返回正确的值?HashTable

我假设 are 类型和返回由 Java 生成的默认值。KeysStringhashCode()

如果我实现自己的哈希函数并将其用作查找表(即a or)的一部分,那么处理冲突的策略是什么?HashMapDictionary

我甚至看过与素数有关的笔记!从谷歌搜索中的信息不太清楚。


答案 1

哈希表以两种方式之一处理冲突。

选项 1:通过让每个存储桶包含哈希到该存储桶的元素的链接列表。这就是为什么一个糟糕的哈希函数会使哈希表中的查找非常慢的原因。

选项 2:如果哈希表条目全部已满,则哈希表可以增加它拥有的存储桶数,然后重新分发表中的所有元素。哈希函数返回一个整数,哈希表必须获取哈希函数的结果,并根据表的大小对其进行修改,这样它就可以确保它将到达存储桶。因此,通过增加大小,它将重新哈希并运行模计算,如果幸运的话,可能会将对象发送到不同的存储桶。

Java 在其哈希表实现中同时使用选项 1 和 2。


答案 2

当您谈到“如果新键条目与另一个键条目发生冲突,则哈希表会将新条目放入'下一个可用'存储桶中”时,您谈论的是哈希表冲突解析的开放寻址策略


哈希表有几种策略来解决冲突。

第一种大型方法要求将键(或指向它们的指针)与关联的值一起存储在表中,其中还包括:

  • 单独链接

enter image description here

  • 开放式寻址

enter image description here

  • 合并哈希
  • 布谷鸟散列
  • 罗宾汉散列
  • 2-选择散列
  • 跳房子散列

处理冲突的另一种重要方法是动态调整大小,它还有几种方法:

  • 通过复制所有条目来调整大小
  • 增量调整大小
  • 单调键

编辑:以上是从wiki_hash_table借来的,你应该去那里看看以获取更多信息。