提问者:小点点

双散列与碰撞的第一和第二散列函数-java


对于双重散列,如果与第一个散列函数发生冲突,您将使用第二个散列函数,但如果仍然发生冲突怎么办?例如,假设哈希表大小为15,散列函数为(键3)%15,第二个散列函数为((键%8)/3)2。假设“插入59”通过第一个散列函数到达索引2,但那里已经有一个键。第二个散列函数会将其带到3,但假设那里也已经有一个值。59将被插入哈希表的哪里,为什么?谢谢

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


共2个答案

匿名用户

这不是我们计算第二个散列函数的方式,因为对于每个探测(槽不可用),您都需要有一个新的散列函数,这是不可行的。

通用的第二个哈希函数将是类型,

H1(x)-第一个散列函数,H2(x)-第二个散列函数

我们第一次尝试跟随插槽-H1(x),

下一个探测将是-H1(x)H2(x),

下一个探头H1(x)2*H2(x)……… H1(x)n*H2(x)

匿名用户

这是特定于实现的,但通常您会使用链表或其他灵活的数据结构来管理碰撞数据。

从java. util.HashMap javadoc:

它使用哈希桶方法;也就是说,哈希冲突是通过将新节点与预先存在的节点(或节点列表)连接起来来处理的。通过这种方式,避免了诸如线性探测(这可能导致主聚类)和重新哈希(这不太适合Java的预计算哈希码的方法)等技术。在理想情况下(没有冲突),HashMap在大多数操作上提供O(1)性能(包含值()当然是O(n))。在最坏的情况下(所有键映射到相同的哈希码——非常不可能),大多数操作都是O(n)。