【问题标题】:Time Complexity for Java ArrayListJava ArrayList 的时间复杂度
【发布时间】:2011-09-26 07:10:14
【问题描述】:

我发现此问题的其他条目涉及特定方法,但并不全面。我想验证一下我自己对这种数据结构最常用方法的理解:

O(1) - 恒定时间:

isEmpty()
add(x)
add(x, i)
set(x, i)
size()
get(i)
remove(i)

O(N) - 线性时间:

indexof(x)
clear()
remove(x)
remove(i)

这是正确的吗?感谢您的帮助。

【问题讨论】:

  • 认为 add(x, i) 应该在第二组,如果我理解你的问题。
  • remove(i) 在 O(1) 和 O(N) 中
  • remove(i) 在最坏情况和平均情况下都是 O(N),在最好情况下是 O(1)(准确删除最后一个元素)。

标签: java arrays data-structures arraylist abstract-data-type


【解决方案1】:

最好的资源直接来自official API

size、isEmpty、get、set、iterator 和 listIterator 操作在恒定时间内运行。添加操作在摊销常数时间内运行,即添加 n 个元素需要 O(n) 时间。所有其他操作都以线性时间运行(粗略地说)。与 LinkedList 实现相比,常数因子较低。

【讨论】:

  • 这确实有帮助,谢谢。我现在明白为什么 add(x, i) 会在线性时间内运行(最坏的情况),因为它可能必须将数组中的一堆元素移到更高的位置才能插入一个新元素。与删除(i)相同。摊销常数时间和常规常数时间有什么区别?
  • @dvanaria 关于摊销常数时间的一些很好的答案在stackoverflow.com/questions/200384/constant-amortized-time这个帖子中。基本上,平均时间是恒定的,但每个单独的操作可能需要更多时间——在这种情况下,底层数组必须调整大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多