在第一个和第二个散列函数-java上使用碰撞进行双重散列

时间:2014-11-12 03:19:17

标签: java hash double-hashing

对于双重散列,如果与第一个散列函数发生冲突,则使用第二个散列函数,但是如果仍然存在冲突怎么办?例如,假设哈希表的大小为15,哈希函数为(key + 3) % 15,第二个哈希函数为((key % 8) / 3) + 2。假设“插入59”由第一个哈希函数转到索引2,但那里已经有一个键。第二个哈希函数将它带到3,但是让我们说那里已经存在一个值。 59将在何处插入哈希表?为什么?感谢

我特别想要使用双重散列,而不是链式散列或线性探测。

2 个答案:

答案 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)。