【问题标题】:Is this approach to dealing with hash collisions new/unique?这种处理哈希冲突的方法是新的/独特的吗?
【发布时间】:2019-04-28 22:13:06
【问题描述】:

在处理哈希映射时,我看到了一些处理哈希冲突的策略,但我们想出了一些不同的方法。 我想知道这是否是新事物。

这个版本的哈希映射只有在哈希和将被哈希的数据结构是可盐分的情况下才有效。 (Haskell 的 hashable 就是这种情况,我们建议在其中实施这种方法。)

这个想法是,不是在哈希映射的每个单元格中存储一个列表或数组,而是存储一个递归哈希映射。此递归哈希映射的唯一区别是您使用不同的盐。 这样,哈希映射的一个级别上的哈希冲突很可能不是下一级的哈希冲突。 因此,插入这样的哈希映射不再是 O(此哈希上的冲突次数),而是 O(此哈希上的冲突以递归方式发生的级别数),这很可能更好。

更详细的解释和实现可以在这里找到:

https://github.com/tibbe/unordered-containers/pull/217/files/58af4519ace34c5f7d3c1359907ff75e27b9cdb8#diff-ba23e0f18c79cb873ac5375367524cfaR114

【问题讨论】:

  • 我觉得这更适合计算机科学堆栈交换。
  • 我可以看到的一个问题是,“正常”哈希图将所有数据存储在一个可能适合缓存的线性数组中,而这种方法将其存储在多个中。这意味着从一个级别到下一个级别通常需要访问主内存,这可能会比通常的实现慢。
  • 策略让我想起了cuckoo hashing;它并不完全相同,但可能值得查看有关杜鹃散列的文献,看看是否有这样的变体。
  • 我会注意,您为额外哈希表分配的空间可用于使顶级哈希表更稀疏,从而首先减少第一个哈希中发生冲突的机会。
  • @chepner 不是真的;请记住,哈希冲突会受到生日悖论的影响。

标签: haskell hash hashmap hashable unordered-containers


【解决方案1】:

您的想法似乎与the Fredman, Komlós & Szemerédi paper from 1984 中建议的想法实际上相同。作为Wikipedia summarizes it

FKS Hashing 使用具有两个级别的哈希表,其中顶层包含 n 个存储桶,每个存储桶都包含自己的哈希表。

与您的想法相反,本地哈希映射不是递归的,而是它们每个都选择一个盐,使其成为完美的哈希。在实践中,这将(如您所说)通常已经由您尝试的第一种盐给出,因此它是渐近常数时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多