【问题标题】:A Hashmap bucket can contain different hashcoded object. If so How hashmap achieves O(1)一个 Hashmap 桶可以包含不同的 hashcoded 对象。如果是这样 hashmap 如何实现 O(1)
【发布时间】:2016-02-20 02:29:45
【问题描述】:

您好,我想了解 hashmap 的工作原理。 Hashmap 基于 hasing 原理工作。

我怀疑我是否可以在同一个桶中包含不同的哈希编码对象?如果可能意味着 get(key) 如何达到 O(1) 时间 ?因为根据 hashcode 和 hashing,会找到 Bucket。但是必须遍历元素对。那么它将是O(1)。

例如 我的桶大小是 4 我将放置元素 "X"( hashcode - 3) , "Y" ( hashcode - 7) , "Z"( hashcode - 11) 。所有这三个元素桶位置都将是 3 。如果我调用 get("Z") 意味着它必须遍历存储桶中的元素,那么只有它才能找到。那么怎么会是O(1)呢。

请任何人帮助我消除我的疑问。提前致谢

【问题讨论】:

    标签: java hashmap time-complexity hashcode


    【解决方案1】:

    因为 hashmap 查找算法是这样工作的:

    1. 从对象派生一个整数哈希值 - O(1)
    2. 找到该哈希的存储桶 - O(1)
    3. 在该存储桶中查找对象 - O(number of collided hashes in that bucket)

    虽然number of collided hashes in that bucket 在极端情况下(例如我们只有一个桶)可以向n 增加,但在推导算法的Oness 时不考虑这些情况。这个值被认为是1,因为增加n 不会影响它的成本,即使在正常情况下也是线性的。

    【讨论】:

      【解决方案2】:

      首先,HashMapget(Key)s 时间复杂度并不总是O(1)O(1) 是理想的情况。

      HashMap 有一个实例数组Entry。对象的 HashCode 决定了“新条目”应该在这个数组的哪个索引中。如果 2 个对象必须进入同一个存储桶/索引(如果发生冲突),则使用 LinkedList 并将新条目添加到 LinkedList。 最坏的情况,所有的条目都可以映射到同一个索引(如果只有一个桶),时间复杂度将是O(n)

      【讨论】:

      • 从Java8开始,如果特定的bucket包含8个或更多节点,则将链表转换为Tree。那么时间复杂度将是 O(log(n))。
      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 2011-05-17
      • 2012-02-09
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      相关资源
      最近更新 更多