当我们通过重复加倍实现动态数组时,我们只需创建一个新数组,该数组是当前数组大小的两倍,并复制前面的元素,然后添加新的元素?正确的吗?
所以要计算复杂度我们有1 + 2 + 4 + 8 + ....步数?正确的吗?
但是
1 + 2^1 + 2^2 + .... + 2^n = (2^(n-1) - 1) ~ O(2^n).
但是给出了
1 + 2 + 4 + ... + n/4 + n/2 + n ~ O(n).
哪一个是正确的?为什么?感谢
答案 0 :(得分:9)
你的总和是合适的,但你的条款太多了。 : - )
当阵列达到2的幂时,阵列的大小将加倍。因此,如果遇到的两个最大幂是2 k ,那么完成的工作是
2 0 + 2 1 + 2 2 + ... + 2 k
这是几何系列的总和,可用于
2 0 + 2 1 + 2 2 + ... + 2 k = 2 k + 1 - 1 = 2·2 k - 1
在你的分析中,你把这个总和写成n个项,最多2个 n 。如果你的数组中有2个 n 元素,那么这将是正确的总和,但这个指数太多了。相反,由于您的数组中包含n个元素,因此该总和中的最大项为2 lg n 。将其插入
2·2 lg n - 1 = 2n - 1 =Θ(n)
因此,完成的工作总量为Θ(n),而不是Θ(2 n )。
希望这有帮助!