动态阵列通过重复加倍的时间复杂度

时间:2014-06-01 12:56:19

标签: arrays big-o complexity-theory time-complexity dynamic-arrays

当我们通过重复加倍实现动态数组时,我们只需创建一个新数组,该数组是当前数组大小的两倍,并复制前面的元素,然后添加新的元素?正确的吗?

所以要计算复杂度我们有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).

哪一个是正确的?为什么?感谢

1 个答案:

答案 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 )。

希望这有帮助!