List.Add的渐近复杂性是什么?

时间:2016-05-26 21:28:44

标签: c# algorithm asymptotic-complexity

我发现关于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()的真正基准如下。然而,基准测试并不能真正表达这种操作 - 在任何偏离直线(对数刻度)线变得可见之前,我们可能会耗尽内存。

benchmark

1 个答案:

答案 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>