17.2-1
每个
k
次PUSH
或POP
执行一次COPY
,那么使PUSH
和POP
的
17.2-2
每次操作的代价都是
由于摊还代价是
3
美元,
17.2-3
使用一个指针记录最高位
A.max
是否 1,初始时设为 -1。
INCREMENT(A)
i = 0
while i < A.length and A[i] == 1
A[i] = 0
i = i + 1
if i < A.length
A[i] = 1
// Additions to book’s INCREMENT start here.
if i > A.max
A.max = i
else A.max = -1
RESET(A)
for i = 0 to A.max
A[i] = 0
A.max = -1
和书上一样,假设 1 美元用于翻转某一位,此外还假设更新
A.max
需要 1 美元。
对INCREMENT
操作,1 美元用于设置某位为 1,1 美元用于信用,因此一共需要 2 美元。
我们还需要 1 美元用于更新
max
,如果
max
增加,放置额外的 1 美元在新的最高位上(如果不增加,就浪费掉吧)。对于重置操作,它操纵的位数最多到达
A.max
,并且在
A.max
为 1 的时候,低于
A.max
的都曾变为 1。将低位归零的时候使用信用支付,所以只需支付 1 美元在重设
max
上即可。
最后得,对INCREMENT
操作花费 3 美元,RESET
操作花费 1 美元,最后得到时间是
O(n)
。