动态数组大小调整的摊销分析

时间:2017-06-16 12:16:40

标签: algorithm amortized-analysis amortization

关于调整动态数组大小(作为ArrayList ADT的一部分)的问题令我感到难过。

该文本设置了一个场景,其中元素被添加到数组的末尾。当阵列达到其容量时,它的大小加倍。使用旧数组的元素初始化新的较大数组。对该过程的摊销分析给出了O(n)的复杂性。

然后问以下问题:

  

当容量N的数组已满时,不是将N个元素复制到容量为2N的数组中,而是将它们复制到具有N / 4个附加单元的数组中,即容量数组(N + N) / 4)。显示执行n个添加序列   该数组仍然在O(n)中运行。

非常感谢任何有关如何处理此问题的提示和帮助。我不知道如何处理这样一个事实:一个满容量的阵列的大小增加了当前大小的一小部分,而不是当前大小的倍数。

1 个答案:

答案 0 :(得分:1)

连续副本的大小为N,N(5/4),N(5/4)^ 2,......

因此,在K份之后,复制的总成本是

sum(i=0,K-1){ N(5/4)^i } 

此时数组的大小为N(5/4)^(K-1)

所以剩下的就是显示

O( [ sum(i=0,K-1){ N(5/4)^i } ] / [ N(5/4)^(K-1) ] ) = O(1) .

简而言之,这是每个数组元素的复制总成本,这是摊销成本。

显示等式是真的非常简单,逻辑与显示加倍的相似关系非常相似:

O( [ sum(i=0,K-1){ N(2)^i } ] / [ N(2)^(K-1) ] )

我不会带走你的乐趣。