对于双重散列,如果与第一个散列函数发生冲突,您将使用第二个散列函数,但如果仍然发生冲突怎么办?例如,假设哈希表大小为15,散列函数为(键3)%15
,第二个散列函数为((键%8)/3)2
。假设“插入59”通过第一个散列函数到达索引2,但那里已经有一个键。第二个散列函数会将其带到3,但假设那里也已经有一个值。59将被插入哈希表的哪里,为什么?谢谢
我特别想使用双散列,而不是链式散列或线性探测。
这不是我们计算第二个散列函数的方式,因为对于每个探测(槽不可用),您都需要有一个新的散列函数,这是不可行的。
通用的第二个哈希函数将是类型,
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)。