如果重复加倍,为什么调整阵列操作的时间与N成比例?

时间:2015-10-09 05:37:09

标签: arrays algorithm math copy time-complexity

如果数组已满并且其大小增加1以插入新元素,则插入N个元素的时间可以计算为1 + 2 + .. N = N ^ 2/2。 (声明长度为+ 1的新数组并将元素复制到新数组中。)

我无法理解如何计算时间如果不是将数组大小增加1而是声明一个长度为2 * size的新数组,然后复制新数组中的元素。

1 个答案:

答案 0 :(得分:1)

假设您有一个大小为1的数组,每次数组变满时该数组将加倍。

现在,您将要插入2048项:然后,当长度变为2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048时,它将扩展并复制内容。总共需要4094(~2n)次操作。

此外,只需将n个操作简单地插入数组即可。

总之,它是O(n),线性。

可以通过系数r = 2和第一项a1 = 2的几何级数和公式轻松描述:

Sn = a1 * (r ^ n - 1) / (r - 1)
   = 2 * (2 ^ n - 1) / (2 - 1) 
   = 2 * 2 ^ n

其中n是数组的计数"倍增"。

当2的pows加倍时,它通常会接近log2(n)

2 * 2 ^ log2(n) = 2 * n,这意味着它始终是线性的。