维基百科在表示在动态数组末尾插入项目的复杂性是O(1)摊销时意味着什么?

时间:2013-01-13 20:26:26

标签: algorithm data-structures complexity-theory time-complexity dynamic-arrays

http://en.wikipedia.org/wiki/Dynamic_array#Performance

究竟是什么意思?

我认为最后插入的是O(n),因为你必须分配说,原始数组的两倍空间,然后将所有项目移动到该位置,最后插入项目。这个O(1)怎么样?

2 个答案:

答案 0 :(得分:5)

摊销的O(1)效率意味着n次插入的运行时间总和将为O(n),即使任何单独的操作可能需要更长的时间。

由于复制所有内容所需的工作,附加元素可能需要花费O(n)时间,这是完全正确的。但是,由于每次扩展时阵列都会加倍,因此昂贵的倍增步骤会以指数方式减少和减少。结果,在n个插入中完成的总工作量为O(n)而不是O(n 2 )。

详细说明:假设您要插入总共n个元素。调整矢量大小时复制元素的工作总量最多为

  

1 + 2 + 4 + 8 + ... +n≤2n - 1

这是因为首先复制一个元素,然后复制两次,然后复制两次,等等,并且在绝对最坏的情况下复制所有n个元素。这个几何系列的总和可以达到2n - 1,因此最多O(n)个元素会在所有复制步骤中移动。由于您在所有这些操作中进行n次插入并且仅复制O(n)个工作,因此每个操作的摊销效率为O(1)。这并不是说每个操作花费O(1)时间,但是n个操作总共花费O(n)时间。

对于这背后的图形直觉,以及将数组加倍而不是仅增加一小部分的理由,您可能需要查看these lecture slides。最后的图片可能非常相关。

希望这有帮助!

答案 1 :(得分:4)

隔离的每次重新分配都是O(N),是的。但是接下来的N次插入,你不需要做任何事情。因此,每次插入的“平均”成本是O(1)。我们说“成本在多个业务中摊销”。