List.Add 的渐近复杂度是多少?

What is asymptotic complexity of List.Add?

我发现关于 List.Add() 的渐近复杂度存在很多争议。我怀疑它的来源是最坏的情况 that causes underlying array to resize and would logically be O(n) operation. However, the array grows twice in size 每次列表用完 space。这使得 n 元素所需的调整大小与 log(n).

成正比

这是否意味着 Add 操作的渐近复杂度在平均情况下将是 O(n/log(n))

List.Add() 的真实基准如下。然而,基准测试并不能真正表达这种操作——我们可能 运行 在与直线(对数刻度)的任何偏差变得可见之前内存不足。

这意味着 List.Add()amortized complexity 可以通过对调整大小操作求和然后乘以对列表进行的总添加数来计算。

T(n) = (2 + 4 + 8 + ... + n/2 + n) / n

但请注意,求和是 geometric series,我们可以比假设它是(求和)n*log(n):

做得更好
T(n) < 2n/n = 2 -> T(n) is in O(1)

注意:这里我假设您的意思是 add() 作为追加。在任意位置插入元素需要 O(n) 时间,您还必须考虑到这一点,这会将最终结果从 O(1) 分摊复杂度更改为 O(n) 分摊复杂度。