CLRS 17.2核算法

17.2-1
每个 k PUSHPOP执行一次COPY,那么使PUSHPOPcost 21 份用来支付本身的操作,另 1 份用于COPY。

17.2-2
每次操作的代价都是 3,当 i 不是 2 的幂时,支付一美元,信用为 2 美元;否则就支付 i 美元,使用信用支付。
这里写图片描述
由于摊还代价是 3 美元,i=1nc^i=3n,由练习17.1-3得 i=1nci<3n 。即信用不会为负。最后的代价是 O(n)

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值