arrays - 每次以固定常数增长动态数组的效率?

标签 arrays data-structures big-o time-complexity amortized-analysis

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

最佳答案

如果你增加了一些固定的常数 C,那么不,运行时间不会是 O(n)。相反,它将是 Θ(n2)。

要看到这一点,请考虑如果您执行一系列 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 + n2 / c + n / 2

= Θ(n2)



将此与在需要更多空间时将数组大小加倍时的数学进行对比:完成的总工作是

1 + 2 + 4 + 8 + 16 + 32 + ... + n

= 1 + 2 + 4 + 8 + ... + 2log n

= 2log n + 1 - 1

= 2n - 1

= Θ(n)



从 SO 文档移植。

2 的幂和 - 1 + 2 + 4 + 8 + 16 + ...

总和

20 + 21 + 22 + ... + 2n-1



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

关于arrays - 每次以固定常数增长动态数组的效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19146037/

相关文章:

java - 从 BST 获取最大值和最小值(C++ 与 Java)

c - 这两个循环的时间复杂度是多少?

algorithm - 这里介绍的粒子模拟数据结构/算法的正式名称是什么?

algorithm - 在字符串中找到最长的相似子序列

java - 我的字符切换软件返回相同的答案?

javascript - 在聊天框中突出显示关键字,如何为多个关键字添加不同的样式?

ruby - 正则表达式 - 这个用于素数检测的正则表达式的复杂性是多少?

algorithm - O(log n) 到底是什么意思?

ios - 快速限制阵列容量会更有效吗?

javascript - 接收一个对象(参数)并返回一个数组