在处理哈希映射时,我看到了一些处理哈希冲突的策略,但我们提出了一些不同的方法。 我想知道这是否是新事物。
仅当哈希和将被哈希的数据结构可咸化时,此版本的哈希映射才有效。
(在Haskell的hashable
中就是这种情况,我们建议实施此方法。)
这个想法是,您可以存储递归哈希图,而不是在哈希图的每个单元格中存储列表或数组。此递归哈希图中的唯一区别是您使用了不同的盐。 这样,哈希映射的一个级别上的哈希冲突很可能不是下一级别上的哈希冲突。 结果,插入到这样的哈希映射中不再是O(此哈希上的冲突数),而是O(此冲突上递归发生的级别数),这很可能会更好。
可以在此处找到更详细的解释和实现:
答案 0 :(得分:4)
您的想法似乎实际上与the Fredman, Komlós & Szemerédi paper from 1984中提出的想法相同。为Wikipedia summarizes it:
FKS哈希使用具有两个级别的哈希表,其中顶层包含n个存储桶,每个存储桶都包含自己的哈希表。
与您的想法相反,本地哈希图不是递归的,而是每个哈希图选择一个使其完美的哈希值。在实践中,这通常(已经说过)通常是由您尝试的第一种盐给出的,因此它是渐近恒定的。