动态堆栈的摊销分析

时间:2011-09-06 06:29:56

标签: algorithm math

以下是关于动态堆栈的摊销分析的文本片段。

  

如果我们将堆栈实现为动态数组。比如说   插入数组成本1,从数组成本中获取元素   1,调整数组大小的成本是移动的元素数量。   (比如说所有其他操作,比如递增或递减)   “顶部”是免费的)。如果我们决定将数组的大小加倍   调整。现在,在任何“n”运算序列中,总成本为   对于某些2 ^ i,调整大小为1 + 2 + 4 + 8 + ... +(2 ^ i)(即2的幂)   < n(如果所有操作都是推动则那么(2 ^ i)将是最大功率   2比n少。总和最多为2n - 1.添加额外的   插入/移除“n”的成本,我们得到总成本< 3n,和我们的   每次操作的amoritzed成本是< 3。

我的问题是作者如何得出总和最多为2n -1的结论。请求帮助举例或证明。

谢谢!

2 个答案:

答案 0 :(得分:1)

它是geometric progression

的总和
SUM(q^k for k = 0 to n) = (q ^n+1 -1)/ (q-1)

然后在你的情况下你有:

SUM(2^k for k = 0 to i) = 2^(i+1) - 1 

然后从2 ^ i< Ñ

2^(i+1) < 2n 

SUM(2^k for k = 0 to i) = 2^(i+1) - 1 < 2n - 1

答案 1 :(得分:1)

您正试图找到总和:

1 + 2 + 4 + ... + 2^i

我们可以看到这与:

相同
2^0 + 2^1 + ... + 2^i

我们将此总和表示为S(i)。查看前几个值,您可能会看到一种模式:

S(0) = 2^0       = 1         = 1
S(1) = 2^0 + 2^1 = 1 + 2     = 3
S(2) = ...       = 1 + 2 + 4 = 7
S(3) = ...       = ...       = 15
S(4) = ...       = ...       = 31

我们可以看到它们似乎都比2的幂小一些。更确切地说:S(i) 似乎等于2^(i+1) - 1。我们可以通过归纳证明这一点:

基本情况:

S(0) = 2^(0+1) - 1

我们可以简单地看到上述陈述是正确的。

归纳步骤:

我们知道:

S(i) = S(i-1) + 2^(i)

从总和的定义可以看出。此外,如果S(i-1) = 2^(i) - 1则:

S(i) = (2^(i) - 1) + 2^(i)
       = 2*(2^(i)) - 1
       = 2^(i+1) - 1

因此,我们已经证明了i >= 0

的所有整数S(i) = 2^(i+1) - 1

现在,回到原来的问题,我们得到了2^i < n。然后我们有:

S(i) = 2^(i+1) - 1
     = 2*(2^i) - 1
     < 2*n - 1
因此,我们已经证明S(i)&lt; 2 * N + 1中。