6

因此,当每次添加元素时动态数组的大小加倍时,我了解扩展的时间复杂度是 O(n) n 是元素。如果数组被复制并移动到一个新数组,当它已满时,它只大 1 大小怎么办?(而不是加倍)当我们通过某个常数 C 调整大小时,时间复杂度总是 O(n)?

4

1 回答 1

9

如果你增长了某个固定常数 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对数 n + 1 - 1

= 2n - 1

= Θ(n)


从 SO 文档移植。

2 的幂和 — 1 + 2 + 4 + 8 + 16 + ...</h3>

总和

2 0 + 2 1 + 2 2 + ... + 2 n-1

简化为 2 n - 1。这解释了为什么可以存储在无符号 32 位整数中的最大值为 2 32 - 1。

于 2013-10-02T20:20:12.620 回答