【问题标题】:Hashmap procedure to resolve collisionsHashmap 程序来解决冲突
【发布时间】:2016-04-14 18:04:17
【问题描述】:

好的,所以我最近阅读了很多关于 HashMap 的内容,我认为有些人让它比实际情况更令人困惑。我想知道这个过程是否正确。

因此,如果您有 KeyValue,例如 Peter Dirichlet,他出生于 1805-02-13,在本例中为 Key将是 "Peter Dirichlet"Value"1805-02-13"

第一步是在Key 上使用哈希函数,即"Peter Dirichlet"。假设哈希函数将其生成到桶 nr 5。这意味着在那个特定的桶中,在索引5 上,键/值对"Peter Dirichlet","1805-02-13" 将被存储。

因此,如果我们要检索此信息,我们使用get("Peter Dirichlet") 并使用哈希函数,将找到索引号并找到键/值对 Peter Dirichlet 1805-02-13。

然后我们遇到了碰撞的情况。假设我们现在有"Leo Euler" 出生"1783-09-18"。并且出于某种原因,我们的哈希函数也将珍贵的 Leo 放入索引号5。由于 Key-Value 与 Peter Dirichlet 相同,因此不会有替代品。

现在,在第五个“桶”中,我们有 Leo Euler 和 Peter Dirichlet。 如果我们现在要检索 Leo,我们使用get("Leo Euler"),哈希函数将指向我们的存储桶编号 5。 “糟糕”,HashMap 说,“这里发生了冲突”。 然后我们将遍历这些对象,直到找到"Leo Euler".equals("Leo Euler")。所以它会得到key.equals(key)? 因此,我们不会为"Peter Dirichlet" 提供true,而是为Leo 提供true,并返回键/值对。

这是对HashMap 的正确解释吗?

【问题讨论】:

  • 是的。在您的情况下,冲突解决方案是链式解决方案,但冲突解决方案还有其他可能性(最重要的是线性探测、二次探测)。
  • 好的,我也会考虑的。谢谢。

标签: algorithm data-structures hashmap


【解决方案1】:

是的,这是正确的解释。 .hashcode()(对于 Java,其他编程语言的等价物)是不够的。有可能发生碰撞。它将遍历存储桶并将每个元素的查询(一个键)与该键值对的键进行比较。当然,从找到正确键的那一刻起,就会返回其对应的值。如果在bucket中找不到key,我们就知道它不在hashmap中。

这就是为什么.equals.hashcode彼此有一个契约:如果a.equals(b),那么a的哈希码必须等于ba.hashcode() == b.hashcode()。请注意,反之则不然:具有相同的哈希码并不意味着对象是等价的。

也许对您的问题的一个小评论是 HashMap 的内部数组不由键值对组成,它由键值的集合组成对。在许多情况下,这要么是LinkedList,要么是ArrayList。一些实现使用二叉搜索树,尽管通常它往往不会带来太多回报:毕竟使用好的散列函数应该可以减少冲突的数量。

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多