Java 关于arraylist和linkedlist的时间复杂性

Java 关于arraylist和linkedlist的时间复杂性,java,arraylist,linked-list,time-complexity,Java,Arraylist,Linked List,Time Complexity,在这本书的第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)遍历?第一个问题是有争议的。删除ArrayList中的最后一个元素时,它是常量,但对于中间元素,需要将所有后续元素向左移动。Java使用System

在这本书的第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)遍历?

第一个问题是有争议的。删除ArrayList中的最后一个元素时,它是常量,但对于中间元素,需要将所有后续元素向左移动。Java使用System.arrayCopy()来实现这一点,这是一个复制数组的非常快速的本机例程,但即使是这种方法也显然是O(n),而不是常量,所以我倾向于同意您的观点。对于insert则不同,将数组调整到所需索引的摊余成本平均为一个常数因子,因此add()是O(1)

第二种方法可以这样实现,但事实并非如此。移除仅从开始处开始。我猜这是为了通过不同步的访问来减少事故


最后,在大O复杂度的符号中,不太重要的因素被丢弃,因此O(min(i,n-i))实际上相当于O(n),尽管现实世界告诉我们前者肯定是一种优化。

remove(i)
对于ArrayList来说绝对不是
O(1)
。你能在你的文章中加入上下文吗?我没有第六版,但我找到了第四版的pdf,其中讨论了围绕该页码的基于arraylist的堆栈实现。在这种情况下,通过从ArrayList末尾移除元素来弹出元素实际上是
O(1)
@其他人请查看此链接:我明白了。ArrayList为
O(1)
,LinkedList为
O(min{i,n−i} )
。这是错误的。我看了勘误表,没有提到。谢谢。请注意,第二个问题是关于添加而不是删除。在第三个问题中,我想确认我的理解是否正确,如果我们从一开始就搜索它,它就是我,从一开始它就是n。