对于添加ArrayList Java API的方法:
添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。
我想知道当使用LinkedList的add方法时,它是否是同一时间复杂度,线性。
答案 0 :(得分:9)
这取决于您要添加的位置。例如。如果在ArrayList中添加到列表的前面,实现将不得不每次都移动所有项目,因此添加n个元素将以二次方运行。
类似于链表,JDK中的实现保留了指向头部和尾部的指针。如果你继续附加在尾部,或者在头部前面,则操作将在n个元素的线性时间内运行。如果您追加到其他位置,则实现必须在链接列表中搜索正确的位置,这可能会使运行时更糟糕。同样,这取决于插入位置;如果你在列表中间插入,你会得到最差的时间复杂度,因为必须遍历最大元素数才能找到插入点。
实际的复杂程度取决于您的插入位置是否恒定(例如,始终位于第10个位置),或者是列表中项目数量的函数(或者对其进行任意搜索)。第一个会给你O(n)一个稍差的常数因子,后者O(n ^ 2)。
答案 1 :(得分:4)
在大多数情况下,ArrayList
优于LinkedList
方法上的add()
,因为它只是保存指向数组的指针并递增计数器。
但是,如果woking数组不够大,ArrayList
会增加工作数组,分配一个新数组并复制内容。这比向LinkedList
添加新元素要慢 - 但如果你经常添加元素,那么只会发生O(log(N))次。
当我们谈论“摊销”的复杂性时,我们会计算一些参考任务的平均时间。
所以,回答你的问题,它的复杂性不同:它在大多数情况下要快得多(尽管仍然是O(1)),有时候要慢得多(O(N))。使用分析器可以更好地检查对您有什么好处。
答案 2 :(得分:3)
如果你的意思是add(E)
方法(而不是add(int, E)
方法),答案是肯定的,将单个元素添加到LinkedList的时间复杂度是恒定的(添加n个元素需要O(n) )时间)
作为Martin Probst indicates,您可以使用不同的位置获得不同的复杂性,但add(E)
操作将始终将元素附加到尾部,从而导致常量(摊销)时间操作