【问题标题】:About time complexity of arraylist and linkedlist关于arraylist和linkedlist的时间复杂度
【发布时间】:2018-04-18 15:54:20
【问题描述】:

data structures and algorithms 书的第 290 页中提到,arraylist 的 remove(i) 复杂度为 O(1)。我的第一个问题是为什么不是 O(n)?还提到链表的add(i,e)是O(n),所以我的第二个问题是为什么不是O(min(i,n-i))?

最后,我的第三个问题是复杂性被称为 O(min(i,n-i)) 的原因是因为它是一个双向链表,这意味着我们可以从开头 (i) 或结尾 (n-i) 遍历?

【问题讨论】:

  • remove(i) for ArrayList 绝对不是O(1)。您可以在帖子中包含上下文吗?我没有第六版,但我找到了第四版的 pdf,其中讨论了围绕该页码的基于 arraylist 的堆栈实现。在这种情况下,通过从 ArrayList 末尾删除元素来弹出元素实际上是 O(1)
  • @thatotherguy 请看这个链接:doc.lagout.org/programmation/Java/…
  • 我明白了。它说 java.util.List.remove(i) 对于 ArrayList 是 O(1),对于 LinkedList 是 O(min{i,n−i})。这是错误的。我看了勘误表,没有提到。

标签: java arraylist linked-list time-complexity


【解决方案1】:

第一个值得商榷。当您删除 ArrayList 中的最后一个元素时,它是恒定的,但对于中间元素,您需要将所有后继元素向左移动。 Java 使用 System.arrayCopy() 来做到这一点,这是一个用于复制数组的非常快速的本机例程,但即使该方法显然也是 O(n),而不是恒定的,所以我倾向于同意你的观点。插入则不同,其中将数组大小调整到所需索引的摊销成本平均为一个常数因子,因此 add() 为 O(1)。

第二个可以这样实现,但事实并非如此。删除仅从头开始。我猜这个选择是为了通过非同步访问来减少事故。

最后,在 Big-O 复杂度的符号中,不太重要的因素被丢弃了,所以 O(min(i,n-i)) 实际上等价于 O(n),即使现实世界告诉我们前者肯定会做个优化。

【讨论】:

  • 谢谢。请注意第二个问题是关于添加而不是删除。在第三个问题中,我想确认我的理解是否正确,如果我们从头开始搜索是 i,从尾搜索是 n。
猜你喜欢
  • 2022-07-18
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多