Algorithm 维基百科说在动态数组末尾插入项的复杂性是O(1)摊销的,这意味着什么?

Algorithm 维基百科说在动态数组末尾插入项的复杂性是O(1)摊销的,这意味着什么?,algorithm,data-structures,complexity-theory,time-complexity,dynamic-arrays,Algorithm,Data Structures,Complexity Theory,Time Complexity,Dynamic Arrays,这到底是什么意思 我认为在末尾插入应该是O(n),比如说,你必须分配两倍于原始数组的空间,然后将所有项移动到该位置,最后插入项。这是怎样的O(1)?每个单独的再分配都是O(N),是的。但是在接下来的N次插入中,您不需要做任何事情。所以每次插入的“平均”成本是O(1)。我们说“成本在多个操作中摊销”。摊销O(1)效率意味着n次插入的运行时间之和将是O(n),即使任何单个操作可能需要更长的时间 您完全正确,追加元素可能需要O(n)个时间,因为复制所有内容所需的工作。但是,由于阵列在每次扩展时都会加倍

这到底是什么意思


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

每个单独的再分配都是O(N),是的。但是在接下来的N次插入中,您不需要做任何事情。所以每次插入的“平均”成本是O(1)。我们说“成本在多个操作中摊销”。

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

您完全正确,追加元素可能需要O(n)个时间,因为复制所有内容所需的工作。但是,由于阵列在每次扩展时都会加倍,因此昂贵的加倍步骤以指数形式发生的次数越来越少。因此,在n个插入件中完成的总功是O(n),而不是O(n2)

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

1+2+4+8+…+N≤ 2n-1

这是因为首先复制一个元素,然后复制两次,然后复制两次,以此类推,在绝对最坏的情况下,复制所有n个元素。这个几何级数的和计算为2n-1,所以在所有复制步骤中最多移动O(n)个元素。由于您不需要n个插入,并且在所有插入之间只需要O(n)个总工作复制,因此每个操作的摊销效率为O(1)。这并不是说每个操作需要O(1)个时间,而是说n个操作总共需要O(n)个时间

要了解这背后的图形直观性,以及将阵列增加一倍而不是只增加一小部分的基本原理,您可能需要查看。最后的图片可能非常相关

希望这有帮助