以下是关于动态堆栈的摊销分析的文本片段。
如果我们将堆栈实现为动态数组。比如说 插入数组成本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的结论。请求帮助举例或证明。
谢谢!
答案 0 :(得分:1)
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中。