对于双重散列,如果与第一个散列函数发生冲突,则使用第二个散列函数,但是如果仍然存在冲突怎么办?例如,假设哈希表的大小为15,哈希函数为(key + 3) % 15
,第二个哈希函数为((key % 8) / 3) + 2
。假设“插入59”由第一个哈希函数转到索引2,但那里已经有一个键。第二个哈希函数将它带到3,但是让我们说那里已经存在一个值。 59将在何处插入哈希表?为什么?感谢
我特别想要使用双重散列,而不是链式散列或线性探测。
答案 0 :(得分:1)
这不是我们计算第二个哈希函数的方式,因为对于每个探测(槽的不可用),你需要有一个新的哈希函数,这是不可行的。
Generic Second Hash函数的类型为
H1(x) - 第一个哈希函数, H2(x) - 第二个散列函数
我们第一次尝试关注广告位 - H1(x),
下一次探测将是 - H1(x)+ H2(x),
下一个探针H1(x)+ 2 * H2(x)........ H1(x)+ n * H2(x)
答案 1 :(得分:-2)
这是特定于实现的,但通常您会使用链接列表或其他灵活的数据结构来管理冲突数据。
来自java.util.HashMap javadoc:
它使用哈希桶方法;也就是说,处理哈希冲突 通过将新节点从预先存在的节点(或列表中)链接起来 节点)。以这种方式,诸如线性探测之类的技术(其中 可以导致主要群集)和重新散列(这不适合 以及使用Java的预计算哈希码的方法)。 在理想情况下(无冲突),HashMap提供O(1) 大多数操作的性能(
containsValue()
是, 当然,O(n))。在最坏的情况下(所有键映射到相同的 哈希码 - 非常不可能),大多数操作都是O(n)。