说我在Java中将N个项添加到ArrayList
。最坏情况下的运行时间是多少?我知道添加单个项目可能是O(N),因为数组可能需要调整大小。当我添加N个项目甚至是因子N时,它不会调整N次,因为(AFAIK)每次调整大小时ArrayList
的容量会增加一些因素。这意味着某种log(N)数量的调整大小。所以看起来应该是O(N log(N))来插入N个项目,但我对此并不完全确定。我看过的旧计算机科学考试的答案为O(N ^ 2)。我错过了什么吗?
int newCapacity = (oldCapacity * 3)/2 + 1;
(from this answer)
答案 0 :(得分:5)
dynamic array在计算机科学中通过摊销时间分析进行了充分研究。简短的回答是,当从空动态数组开始并添加 N 元素时,总时间为 O ( N )。
如果必须执行调整大小,那么添加单个项目的最坏情况时间为 O ( N ),并且 O < / em>(log N )调整大小。
但是当我们添加这些调整大小操作时,总数只有 O ( N ),这非常好。下面是一个示例,说明缩放因子为2时(而不是ArrayList的缩放因子为3/2):
N = 64:调整大小为1,2,4,8,16,32,64。总操作= 127(大约2 N )。