解决散列字符串中冲突的最佳方法

时间:2012-02-05 13:41:15

标签: hash

我在接受采访时被问到这个问题并说使用了第二个功能,但是面试官一直在探究我的其他答案。有没有其他解决方案?

4 个答案:

答案 0 :(得分:2)

  

解决散列字符串中冲突的最佳方法   “连续插入”

假设插入的字符串的内容无法预测,那么合理的选项是:

  1. 使用置换列表,因此您可以尝试使用多个偏移量 哈希到桶,直到你找到一个免费的桶(由表修改 尺寸)。位移列表可能看起来像{3,5,11, 19 ...}等 - 理想情况下你想要有区别 位移不是一系列其他位移的总和。
  2. 使用不同的算法重新散列(但是你需要另一个算法) 算法,如果碰巧碰撞两次等。)
  3. root中的一个容器 桶,可以搜索碰撞的字符串。通常 桶的数量应该类似于或大于 元素数量,因此每个桶的元素将相当小 通过数组/向量进行蛮力搜索是合理的 方法,但链表也是可信的。
  4. 比较这些,位移列表往往是最快的(因为添加偏移比计算另一个哈希或支持单独的堆和分配更便宜,并且在大多数情况下,前一个或两个位移(可以合理地通过一小部分) (多个桶)足以找到一个空桶,因此内存使用的位置是合理的)尽管它们比另一种哈希算法(它应该接近#elements /#bucket进一步碰撞的机会)更容易发生冲突。使用位移列表和重新散列,您必须提供足够的重试,实际上您不会期望完全失败,为故障添加一些最后的处理,或接受可能发生的故障。

答案 1 :(得分:0)

使用链接列表作为哈希桶。所以任何碰撞都会得到妥善处理。

答案 2 :(得分:0)

替代方法:您可能希望使用trie而不是字符串字典的哈希表来进行concider。

这种方法的好处是你获得O(|S|)最坏情况的复杂性来寻找/插入每个字符串[其中| S |是该字符串的长度]。请注意,哈希表只允许O(|S|)的平均值,其中最坏的情况是O(|S|*n) [其中n是字典的大小]。当负载平衡过高时,trie也不需要重新散列。

答案 3 :(得分:0)

假设我们没有使用a perfect hash function(你通常没有),哈希告诉你:

  • 如果哈希值不同,则对象是不同的

  • 如果散列相同,则对象可能相同(如果使用了良好的散列函数),但可能仍然是不同的。

因此在哈希表中,如果对象实际上是相同或不相同的话,将通过一些额外的检查来解决冲突(这会带来一些性能损失,但根据Amdahl's law,你仍然获得了很多,因为冲突好的哈希函数很少发生)。在字典中,您只需解决罕见的碰撞情况,并确保您获得正确的对象。

使用另一个非完美哈希函数不会解决任何问题,它只会减少(另一个)冲突的可能性。