【问题标题】:HashMap put() api time complexityHashMap put() api 时间复杂度
【发布时间】:2017-05-17 12:40:09
【问题描述】:

所以我正在阅读有关 Java 集合 api 的信息,并且想知道 HashMap put() api,根据文档,它说它是一个恒定时间操作,但让我感到困惑的是,是否将重新散列作为时间复杂度计算的一部分考虑在内,或者不是。

ArrayListadd() api 在另一边清楚地说明了它的摊销 o(n) 即添加 n 个元素需要 n 时间,为什么它不适用于 HashMap put 那么呢?尽管HashMap 在达到负载因子时动态创建更大的存储桶,并将哈希重新应用于现有的整体以确定新的存储桶位置。

我们将非常感谢您对上述解释的任何帮助,如果需要将这些问题移至其他部分,请在否决之前告诉我。

谢谢。

【问题讨论】:

标签: java algorithm collections hashmap time-complexity


【解决方案1】:

每当表变得太满时,就会分配一个比常数因子(例如两倍大)更大的新表,并且所有元素都从旧表移动到新表。因此,put() 的单个特定调用有时可以在 Θ(n) 时间内运行,但是(从空表开始)put() 的整个 n 调用序列将始终在预期的 O(n) 时间内运行 - 这是每次操作摊销的预期 O(1) 时间。

【讨论】:

  • 所以这意味着,它不是常数 O(1),对于更高的数据负载,HashMap put() 的性能会受到影响。
  • 如果您期望大量数据,您可以显式设置容量:HashMap h = new HashMap(3000),在这种情况下,重新排列的频率会降低或不会发生。
  • @Techfist 这并不是真正的工作方式。如果您有 K 个put 操作,它们将始终花费 O(K) 时间。在任何单个程序中,puts 的平均时间总是 O(1)。
猜你喜欢
  • 2020-10-11
  • 2011-12-31
  • 2021-04-17
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2016-02-13
相关资源
最近更新 更多