关于调整动态数组大小(作为ArrayList ADT的一部分)的问题令我感到难过。
该文本设置了一个场景,其中元素被添加到数组的末尾。当阵列达到其容量时,它的大小加倍。使用旧数组的元素初始化新的较大数组。对该过程的摊销分析给出了O(n)的复杂性。
然后问以下问题:
当容量N的数组已满时,不是将N个元素复制到容量为2N的数组中,而是将它们复制到具有N / 4个附加单元的数组中,即容量数组(N + N) / 4)。显示执行n个添加序列 该数组仍然在O(n)中运行。
非常感谢任何有关如何处理此问题的提示和帮助。我不知道如何处理这样一个事实:一个满容量的阵列的大小增加了当前大小的一小部分,而不是当前大小的倍数。
答案 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) ] )
我不会带走你的乐趣。