当前位置: 首页 > 知识库问答 >
问题:

哈希表在相同或冲突值上的线性程度如何?

况庆
2023-03-14

为了更好地理解散列,我查看了这个StackOverflow答案,并看到了以下内容(关于我们需要在恒定时间内获得桶大小的事实):

如果使用线性探测或双重散列,查找散列到相同值的所有项意味着需要对值进行散列,然后遍历表中非空项的“链”,以查找散列到相同值的项的数量。这与散列到相同值的项数不是线性的,而是与散列到相同值或冲突值的项数成线性的。

这意味着它“在散列到相同或冲突值的项目数量上是线性的”吗?它不会在哈希表中的项目总数上是线性的吗,因为它可能需要在线性探测期间遍历每个值?我不明白为什么它必须遍历碰撞的那些。

例如,如果我在一个哈希表上使用线性探测(步长1),我有不同的键(不冲突,所有哈希都是唯一值)映射到奇数索引槽1,3,5,7,9


共有1个答案

浦琪
2023-03-14

哈希表在概念上类似于链表(表中的bucket)的数组(表)。不同之处在于管理和访问该数组的方式:使用函数生成用于计算数组索引的数字。

一旦有两个元素放在同一个桶中(相同的计算值,即碰撞),那么问题就变成了在列表中搜索。列表中的元素数有望低于哈希表中的元素总数(这意味着其他存储桶中存在其他元素)。

但是,您跳过了该段中的重要介绍:

如果使用线性探测或双重散列,查找散列到相同值的所有项意味着需要对值进行散列,然后遍历表中非空项的“链”,以查找散列到相同值的项的数量。这与散列到相同值的项数不是线性的,而是与散列到相同值或冲突值的项数成线性的。

线性探测是哈希表的另一种实现,在该哈希表中,您不使用任何列表(链)进行冲突。相反,您只需在阵列中找到最近的可用点,从预期位置开始,然后继续。数组的填充量越大,发现下一个位置也被使用的几率就越高,所以你只需要继续搜索。这些位置由散列到相同或冲突值的项使用,尽管您永远不会(也不在乎)这两种情况中的哪一种是,除非您明确地看到现有元素的散列。

本CppCon演示视频对哈希表进行了很好的介绍和深入分析

 类似资料:
  • 问题内容: HashMap中的Hash Collision或Hashing Collision并不是一个新话题,我遇到了多个博客和讨论区,解释了如何产生Hash Collision或如何以模棱两可和详细的方式避免它。我最近在一次采访中遇到了这个问题。我有很多事情要解释,但我认为准确地给出正确的解释真的很困难。抱歉,如果我在这里重复我的问题,请给我准确的答案: 哈希冲突到底是什么?它是一项功能或常见

  • 我正在用一个字符串数组单维和一个2维int数组制作哈希表。我正在使用线性探测进行冲突检测,当我意识到如果检测到冲突,单词的hashCode将不再是索引时,我真的很兴奋地完成了这个程序。我该如何保存该索引以备以后使用?

  • 问题内容: 我的自定义结构实现了Hashable Protocol 。但是,当在键中插入键时发生哈希冲突时,不会自动处理它们。我该如何克服这个问题? 背景 我之前曾问过这个问题, 如何在Swift中为Int数组(自定义字符串struct)实现哈希协议。后来我添加了自己的答案,似乎很有效。 但是,最近我在使用时发现了一个细微的碰撞问题。 最基本的例子 我已将代码简化为以下示例。 定制结构 请注意,为

  • 我试图故意制造碰撞。 所以,我有和对象。我已经覆盖了Country的和方法,以便: india.hash代码()==india2.hash代码() 根据JavaHashMap中的冲突解决方案和文章“让这个国家对象在hashmap中”的一部分,如果key1的结果等于key2上的相同操作,那么应该会有冲突。 所以,我放置断点来查看的内容,并查看它的是2。也就是说,它包含两个不同的条目,并且没有link

  • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

  • 我正在使用这个散列函数,但是我会遇到很多冲突。目的是添加元素的ascii值并输出该值。有什么方法可以优化这个或另一个功能来减少碰撞的次数?