在C ++中,如何处理哈希映射中的哈希冲突?

时间:2011-02-10 04:17:09

标签: c++ data-structures hash

在C ++中,如何处理哈希映射中的哈希冲突?如果发生碰撞,将花费多少时间来搜索元素?

而且,什么是好的哈希函数?

2 个答案:

答案 0 :(得分:8)

根据您使用的系统,有许多不同的方法可以处理哈希映射中的冲突。以下是一些:

  1. 如果您使用封闭式寻址,那么您可能会将每个项目哈希到一个值的链接列表,所有这些值都具有相同的哈希码,然后遍历列表以查找该元素问题。
  2. 如果您使用线性探测,那么在哈希冲突之后,您将开始查看相邻的存储桶,直到找到您要查找的元素或空白点。
  3. 如果你使用二次探测,那么在哈希碰撞之后你会看到元素1,3,6,10,15,...,n(n + 1)/ 2, ......远离碰撞点寻找空白点或有问题的元素。
  4. 如果您使用 cuckoo哈希,您将维护两个哈希表,然后将与之冲突的元素替换为另一个表,重复此过程,直到冲突解决或您必须重新哈希。 / LI>
  5. 如果您使用动态完美散列,则可以从共享该散列码的所有元素中构建完美的散列表。
  6. 您选择的具体实施取决于您。去做最简单的事情。我个人认为链式散列(封闭寻址)是最简单的,如果这个建议有帮助的话。

    至于什么是好的哈希函数,这实际上取决于您存储的数据类型。例如,字符串的散列函数通常与整数的散列函数非常不同。根据您想要的安全保证,您可能希望选择加密安全散列,如SHA-256,或者只是简单的启发式,如单个位的线性组合。设计一个好的哈希函数是非常棘手的,我建议在得出结论之前,先挖掘一下你将要散列的特定结构的建议。

    希望这有帮助!

答案 1 :(得分:1)

通常,哈希映射结构将冲突元素存储在列表或树中。如果它们在列表中,则插入元素花费O(1)时间,但是检索它们需要O(N)(N是碰撞元素的数量而不是有映射中的总数)。如果使用树,则插入和查找都是O(log N)。

良好的哈希函数是最小化冲突的函数。这取决于您的特定数据,但通常一个哈希的输出无法从其输入预测(一个随机散布空间中的项目)是一个不错的选择。