我在接受采访时被问到这个问题并说使用了第二个功能,但是面试官一直在探究我的其他答案。有没有其他解决方案?
答案 0 :(得分:2)
解决散列字符串中冲突的最佳方法 “连续插入”
假设插入的字符串的内容无法预测,那么合理的选项是:
比较这些,位移列表往往是最快的(因为添加偏移比计算另一个哈希或支持单独的堆和分配更便宜,并且在大多数情况下,前一个或两个位移(可以合理地通过一小部分) (多个桶)足以找到一个空桶,因此内存使用的位置是合理的)尽管它们比另一种哈希算法(它应该接近#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,你仍然获得了很多,因为冲突好的哈希函数很少发生)。在字典中,您只需解决罕见的碰撞情况,并确保您获得正确的对象。
使用另一个非完美哈希函数不会解决任何问题,它只会减少(另一个)冲突的可能性。