【问题标题】:double hashing with collision on first and second hash functions-java双重哈希与第一个和第二个哈希函数的冲突-java
【发布时间】:2014-11-12 03:19:17
【问题描述】:

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

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

【问题讨论】:

  • 这是 Java 特有的吗?

标签: java hash double-hashing


【解决方案1】:

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

Generic Second Hash 函数的类型,

H1(x) - 第一个哈希函数, H2(x) - 第二个哈希函数

我们第一次尝试以下插槽 - H1(x),

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

下一个探针 H1(x)+2*H2(x) ........ H1(x)+n*H2(x)

【讨论】:

    【解决方案2】:

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

    来自 java.util.HashMap javadoc:

    它使用哈希桶方法;即处理哈希冲突 通过将新节点链接到预先存在的节点(或列表 节点)。以这种方式,诸如线性探测(其中 可能导致主聚类)和重新散列(不太适合 避免使用 Java 的预计算哈希码方法)。 在理想情况下(没有冲突),HashMap 提供 O(1) 大多数操作的性能(containsValue() 是, 当然,O(n))。在最坏的情况下(所有键映射到相同的 哈希码——不太可能),大多数操作都是 O(n)。

    【讨论】:

    • 问题是关于双散列,这是拥有链表的替代策略。 OP 说他不想链接。
    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2014-03-24
    相关资源
    最近更新 更多