因此,当每次添加元素时动态数组的大小加倍时,我理解扩展的时间复杂度是O(n)n是元素。如果将数组复制并移动到一个只有1个大小的新数组呢? (而不是加倍)当我们调整一些常数C时,时间复杂度总是为O(n)?
答案 0 :(得分:8)
如果你增长一些固定常数C,那么不,运行时不会是O(n)。相反,它将是Θ(n 2 )。
要看到这一点,请考虑如果执行一系列C连续操作会发生什么。在这些操作中,C-1将占用时间O(1),因为空间已经存在。最后一个操作需要花费时间O(n),因为它需要重新分配数组,添加空间并复制所有内容。因此,任何C操作序列都需要时间O(n + c)。
现在考虑如果执行n个操作序列会发生什么。将这些操作分解为大小为C的块;会有他们的n / C.执行这些操作所需的总工作量为
(c + c)+(2c + c)+(3c + c)+ ... +(n + c)
= cn / c +(c + 2c + 3c + ... + nc / c)
= n + c(1 + 2 + 3 + ... + n / c)
= n + c (n/c)(n/c + 1)/2
= n + n(n / c + 1)/ 2
= n + n 2 / c + n / 2
=Θ(n 2 )
将此与数学结果进行对比,以便在需要更多空间时将数组大小加倍:完成的总工作量为
1 + 2 + 4 + 8 + 16 + 32 + ... + n
= 1 + 2 + 4 + 8 + ... + 2 log n
= 2 log n + 1 - 1
= 2n - 1
=Θ(n)
移植自SO文档。
总和
2 0 +2 1 +2 2 + ... + 2 n-1
简化为2 n - 1.这解释了为什么可以存储在无符号32位整数中的最大值是2 32 - 1.