【问题标题】:Separate Chaining Hash Tables - When to stop looking单独的链式哈希表 - 何时停止查找
【发布时间】:2017-01-23 01:32:50
【问题描述】:

关于哈希表的快速问题。 我目前正在实现一个哈希表 使用单独链接的组合 和开放寻址,限制长度 每个bucket的链表到一定的长度。

但是,我无法想出一种有效获取/删除的方法 有了这个哈希表结构,我想知道我是不是盲目愚蠢 或者是否有人曾经处理过类似的问题。

如果我尝试不断地使用冲突解决方案进行探测,我可能会永远进行下去,并且永远不会发现密钥是否不在表中。这是因为大多数探测方法不会覆盖每个桶,我宁愿不使用线性探测。

因为大多数探测方法不会覆盖每个存储桶,并且跟踪您查看过的存储桶的成本很高,如果一个存储桶被清空但探测路径中的后续存储桶没有,那么算法不能简单地停止一旦遇到空桶。

对于这个问题的任何想法,我将不胜感激。

谢谢!

【问题讨论】:

  • 二进制搜索。如果您的数据库(散列图)包含 100 万个条目,您平均只需要约 20 次搜索操作,而不是 500.000 次。唯一的要求是,地图是有序的
  • 我确实意识到一个好的旧二进制搜索的好处,但地图没有排序,我的印象是哈希图的全部意义在于它们不必排序(在这个词的形式算法意义上)以获得良好的性能

标签: algorithm data-structures hash hashmap


【解决方案1】:

在无限碰撞等场景中,我们通常倾向于使用:

  • 线性探测:每次跳转 n 次,其中 n 是质数 >= 7,为什么要质数? 90% 使用素数的 hastables 通常会遍历表格中的每个单元格,因此会遍历整个表格,而不是仅仅在每个单元格之间跳转。
  • poly probling:每次跳转 n 次,其中 n 使用多项式函数重新计算,例如 f(x) = x^2 + 2x + 1,为什么?这会在每个单元格上给出不同的结果,并且不完全基于单元格中的值。

【讨论】:

  • 有趣。也许我应该改为线性探测。我一直在使用“斐波那契探测”,其中探测根据斐波那契序列进行,以便为已解决碰撞的分布提供不同的方法。我是否仍然可以使用这种方法,同时能够在获取/删除期间确定表是否包含密钥而无需花费 O(n) 时间?
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2020-08-24
  • 1970-01-01
  • 2021-03-11
  • 2015-01-14
相关资源
最近更新 更多