Java 将N项添加到ArrayList的大O运行时

Java 将N项添加到ArrayList的大O运行时,java,arraylist,big-o,Java,Arraylist,Big O,假设我在Java中向ArrayList添加N个项。最坏的运行时间是什么?我知道添加单个项目可能是O(N),因为数组可能需要调整大小。当我添加N个项目时,它不会调整N倍的大小,甚至不会调整N倍的大小,因为ArrayList的容量在每次调整时都会增加一倍。这意味着某种日志(N)数量的调整。所以似乎应该是O(N log(N))来插入N个项,但我不能完全确定这一点。我正在看的一个旧的计算机科学考试的答案是O(N^2)。我遗漏了什么吗 int newCapacity=(旧容量*3)/2+1()在计算机科学

假设我在Java中向
ArrayList
添加N个项。最坏的运行时间是什么?我知道添加单个项目可能是O(N),因为数组可能需要调整大小。当我添加N个项目时,它不会调整N倍的大小,甚至不会调整N倍的大小,因为
ArrayList
的容量在每次调整时都会增加一倍。这意味着某种日志(N)数量的调整。所以似乎应该是O(N log(N))来插入N个项,但我不能完全确定这一点。我正在看的一个旧的计算机科学考试的答案是O(N^2)。我遗漏了什么吗

int newCapacity=(旧容量*3)/2+1()

在计算机科学中,在摊销时间分析中,对该问题进行了很好的研究。简而言之,当从一个空的动态数组开始并添加N个元素时,总时间是O(N)

当必须执行调整大小时,添加单个项的最坏情况时间为O(N),并且发生O(log N)调整大小,这是正确的

但是当我们把这些调整大小的操作加起来时,总数只有O(N),这是非常好的。下面是一个示例,用于说明比例因子为2(而不是ArrayList的比例因子为3/2)的情况:


N=64:调整大小为1、2、4、8、16、32、64。总操作数=127(大约2N)。

一个O(N)操作执行日志(N)次不应该导致O(N日志(N)),就像添加到树映射中一样吗?我知道在平衡树中添加N个项目(不是使某个东西变得非常细长)被认为是O(N logn)。从技术上讲是的,但N logn是一个悲观的分析。O(N)是严格的分析。这样想,在32次插入后,重新分配存储并复制32个元素;在64次插入之后,您可以为64个元素执行此操作。当你把container的大小增加一倍时,你需要花费两倍的时间来重新分配,但你也只需要一半的时间。是的,我可以通过归纳法证明,对于任意N,它大约是2N次运算。我假设它通常是f*N,其中f是数组的大小调整因子。接近,但实际上是f/(f-1)*N由于几何级数。=)因子越大,时间开销越小,但会浪费更多空间。如果每次调整大小都会增加相同数量的阵列容量,则O(N^2)是成本界限。也许这就是考题要问的。事实上,我发现考题意味着插入任何位置。这包括前端,它需要将所有东西向下移动。这是O(N^2)。