Big o 编辑:没关系

Big o 编辑:没关系,big-o,Big O,编辑:哇,我真的很抱歉…我不知怎么搞混了第二张图中的LinkedList和ArrayList列>>我睡得不多…对不起…至少有一个答案在其他方面对我有帮助,有详细的解释,所以这篇文章不是完全的浪费 我确实找到了一些关于这方面的话题,但帖子中存在矛盾,所以我想确认谁是正确的 这个话题是我发现的: 投票最多的答案是: “对于LinkedList get是O(n) 加法为O(1) 移除is O(n) 迭代器.remove是O(1) 对于ArrayList get是O(1) add是O(1)摊销的

编辑:哇,我真的很抱歉…我不知怎么搞混了第二张图中的LinkedList和ArrayList列>>我睡得不多…对不起…至少有一个答案在其他方面对我有帮助,有详细的解释,所以这篇文章不是完全的浪费

我确实找到了一些关于这方面的话题,但帖子中存在矛盾,所以我想确认谁是正确的

这个话题是我发现的:

投票最多的答案是:

“对于LinkedList

  • get是O(n)
  • 加法为O(1)
  • 移除is O(n)
  • 迭代器.remove是O(1)
对于ArrayList

  • get是O(1)
  • add是O(1)摊销的,但O(n)是自数组必须调整大小和复制以来的最坏情况
  • 删除“O(n)”
但后来有人在这里发布了一个链接,上面写着:


问题中引用的两个来源之间没有矛盾

关于链接列表的一些想法: 在链表中,我们需要在链表中移动一个指针,以访问任何特定的元素,或者删除它,或者检查它,或者在它之前插入一个新元素。由于java.util.LinkedList实现包含对列表前面和后面的引用,因此我们可以立即访问列表前面和后面,这解释了为什么任何涉及列表前面或后面的操作都是O(1)。如果操作是使用迭代器完成的,那么指针已经在需要它的地方了。因此,从中间删除元素需要O(n)个时间,但是如果迭代器已经花费O(n)个操作到达中间,那么
iter.remove()
可以在O(1)中执行

现在conisider阵列列表: 在引擎盖下,ArrayList将数据存储在一个基本数组中。因此,虽然我们可以在O(1)时间内访问任何元素,但添加或删除元素需要将整个数组下移一个元素,这需要O(n)时间。如果我们添加或删除最后一个元素,这不需要任何移位,因此可以在O(1)中运行


这意味着调用
list.add(newItem)
需要O(1),但有时列表末尾没有空间,因此需要将整个列表复制到新内存中,ArrayList才能执行添加。但是,由于ArrayList每次调整自身大小时都会使以前的容量翻倍,因此在添加n个元素时,此复制操作只会发生log2 n次。所以我们仍然说add在O(1)时间内运行。如果您知道创建ArrayList时要添加多少元素,您可以通过避免复制操作为其提供初始容量以提高性能。

您在哪里看到矛盾?哇,我很抱歉……我不知怎么搞混了第二个图表中的LinkedList和ArrayList列>\u>我没有睡太多觉……对不起。。。谢谢你的详细解释。尽管并没有像我傻乎乎的那个样自相矛盾,但你们的解释确实告诉了我更多关于他们订单的信息,这是很有帮助的。
Algorithm     ArrayList   LinkedList
access front     O(1)         O(1)
access back      O(1)         O(1)
access middle    O(1)         O(N)
insert at front  O(N)         O(1)
insert at back   O(1)         O(1)
insert in middle O(N)         O(1)