【问题标题】:in C++, how to handle hash collision in hash map?在 C++ 中,如何处理哈希映射中的哈希冲突?
【发布时间】:2011-06-24 14:39:05
【问题描述】:

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

那么,什么是好的散列函数?

【问题讨论】:

  • 这些问题没有具体的 C++ 内容,而且过于笼统。如果您需要询问,您应该使用来自 boost 或 TR1 的哈希映射 - 它们为您处理冲突并提供一般合理的哈希函数。什么是最佳的取决于所涉及的数据(有时甚至是哈希桶的数量、冲突处理方法等)——没有一个正确的答案。
  • 听起来很像家庭作业问题。
  • @Piva,准备一次面试,这是来自网站的面试问题...

标签: c++ data-structures hash


【解决方案1】:

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

  1. 如果您使用封闭寻址,那么您可能会将每个项目散列到一个值的链接列表中,所有这些值都具有相同的散列码,然后会遍历该列表以查找元素有问题。
  2. 如果您使用线性探测,那么在哈希冲突之后,您将开始查看相邻的存储桶,直到找到您要查找的元素或空白点。
  3. 如果您使用 二次探测,那么在哈希冲突之后,您将查看元素 1、3、6、10、15、...、n(n+1)/2、 ...远离碰撞点,寻找空位或相关元素。
  4. 如果您使用 cuckoo hashing,您将维护两个哈希表,然后将您碰撞的元素替换到另一个表中,重复此过程直到冲突解决或您必须重新哈希。
  5. 如果您使用动态完美散列,您可以从共享该散列码的所有元素构建一个完美散列表。

您选择的特定实现由您决定。选择最简单的。如果该建议有帮助,我个人认为链式哈希(封闭寻址)是最简单的。

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

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

    一个好的散列函数是最小化冲突的函数。这是哪个函数取决于您的特定数据,但一般来说,其输出无法从其输入预测的散列(将项目随机分散在空间中的散列)是一个不错的选择。

    【讨论】:

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