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

如果哈希表使用单独的链接,为什么不可能有重复的键?

鲁涵映
2023-03-14

所以我对这个有点困惑。如果哈希表使用单独的链接(或线性探测),为什么下面不打印两个值?

         Hashtable<Character, Integer> map = new Hashtable<>();
         map.put('h', 0);
         map.put('h', 1);
         System.out.println(map.remove('h')); // outputs 1
         System.out.println(map.get('h')); // outputs null

我试图理解为什么给定两个相同的键,哈希表不会使用单独的链接来存储这两个值。我是否有点错误地理解了这一点,或者Java只是没有在他们的哈希表类中实现冲突处理?

另一个可能联系在一起的问题是,使用线性探测的哈希表,给定一个键,如何知道哪个值是我们要找的?

提前谢谢!

共有2个答案

车胤运
2023-03-14

我认为你误解了哈希表的工作原理。想象一下,我在找一个id为227828的人。假设我有1000个这样的人。我可以搜索所有1000个,最终找到那个ID和它所属的人。

但是如果他们的id被用作哈希表中的键,那就更容易了。使用id作为键,假设哈希函数对偶数id返回0,对奇数id返回1。然后我所要做的就是找到包含偶数id的框。理想情况下,我只需要搜索500个条目就能找到键——即id,并返回与之相关的值。

但是散列函数更复杂,有很多这样的盒子或桶。可以识别出合适的盒子或桶,然后搜索合适的钥匙。然后返回其关联值。

齐财
2023-03-14

我试图理解为什么给定两个相同的键,哈希表不会使用单独的链接来存储这两个值。

Map(即javadoc)的规范说每个键只存储一个值。这就是HashTableHashMap实现所做的。

当然,单独的链接不会阻止某人使用该属性实现哈希表。put(key,value)在具有单独链接的哈希表上的伪代码大致如下:

  1. 计算密钥的哈希值

如果您对相同的键重复此操作,您将计算相同的哈希值,搜索相同的链,并找到相同的条目。然后更新它,该键仍然只有一个条目...按照规范的要求。

简而言之,上述算法在满足映射方面没有问题。提出API要求。

 类似资料:
  • 关于哈希表的快速问题。我目前正在实现一个哈希表,它结合使用单独的链接和开放寻址,将每个bucket的链表长度限制在一定的长度。 然而,我很难想出一种使用这种哈希表结构高效地获取/删除数据的方法,我想知道我是在盲目地愚蠢,还是以前有人遇到过类似的问题。 如果我尝试使用冲突解决方案不断地进行探测,我可能永远都不会发现密钥是否不在表中。这是因为大多数探测方法不会覆盖每一个桶,我宁愿不使用线性探测。 因为

  • 问题内容: 我偶然发现了一篇博客文章,详细介绍了如何在Python中实现powerset函数。因此,我尝试用自己的方式进行操作,并发现Python显然无法拥有一组集合,因为set无法哈希。这很烦人,因为功率集的定义是它是一组集合,而我想使用实际的集合操作来实现它。 Python集不可散列是否有充分的理由? 问题答案: 通常,在Python中只有不可变的对象才是可哈希的。的不可变的变体- -是哈希的

  • 问题内容: 因此,我了解了HashMap。有人指出: “不可变性还允许缓存不同键的哈希码,这使整个检索过程非常快,并且表明String和Java Collection API提供的各种包装器类(例如)都是非常好的键。” 我不太明白…为什么? 问题答案: : 由于永不更改的内容,因此该类的创建者选择在对哈希进行一次计算之后就对其进行缓存。这样,不会浪费时间重新计算相同的值。

  • 问题内容: 我正在阅读Java 1.6 API提供的HashMap类的代码,无法完全理解以下操作的需要(位于put和get方法的主体中): 该方法具有以下主体: 通过对提供的哈希码执行位操作,可以有效地重新计算哈希。即使API声明如下,我也无法理解这样做的必要性: 这很关键,因为HashMap使用2的幂的哈希表,否则哈希表在低位无差异时会遇到冲突。 我确实知道键值参数存储在数据结构数组中,并且该数

  • 如果我实现一个哈希表,我理解插入是在恒定的时间内完成的。我也明白,如果没有碰撞,我可以在不变的时间内找到物品。然而,如果我插入一个项目,并在任意索引中使用链表链接它,它最终在位置2,但它在列表下链接了3个链接,这是O(n)时间,进行搜索吗?

  • 也许我没有看到什么或者我忘记了在计算运行时考虑的事情,所以请告诉我。