我发现关于List.Add()
的渐近复杂性存在很多争议。我怀疑它的来源是最糟糕的情况that causes underlying array to resize,并且逻辑上是O(n)
操作。但是,每个时间列表的array grows twice in size空间不足。这使得n
元素所需的调整大小与log(n)
成比例。
这是否意味着Add
操作在一般情况下的渐近复杂度为O(n/log(n))
?
List.Add()
的真正基准如下。然而,基准测试并不能真正表达这种操作 - 在任何偏离直线(对数刻度)线变得可见之前,我们可能会耗尽内存。
答案 0 :(得分:9)
这意味着可以通过对调整大小操作求和,然后乘以对列表进行的总添加次数来计算List.Add()
的{{3}}。
T(n) = (2 + 4 + 8 + ... + n/2 + n) / n
但请注意,总和是amortized complexity,我们可以做得更好而不是假设(求和)n*log(n)
:
T(n) < 2n/n = 2 -> T(n) is in O(1)
注意:我假设你的意思是add()
作为追加。在任意位置插入元素需要O(n)
时间,您也必须考虑到这一点,这会将最终结果从O(1)
摊销的复杂性更改为O(n)
摊销的复杂性。< / p>