算法导论【摊还分析】—聚合分析、核算法、势能法

40 篇文章 6 订阅

算法导论【摊还分析】—聚合分析、核算法、势能法

假定我们对一个数据结构执行一个由 n 个操作组成的操作序列,当 i 严格为 2 的幂时,第 i 个操作的代价为 i,否则代价为 1

聚合分析

总共有n个操作, 1 , 2 , 4..... , 2 ⌊ lg ⁡ n ⌋ 1,2,4.....,2^{⌊\lg n⌋} 1,2,4.....,2lgn,其中有至多 k = ⌈ lg ⁡ n ⌉ k=⌈\lg n⌉ k=lgn个操作序号为2的幂,则
S = ∑ k = 0 ⌊ lg ⁡ n ⌋ 2 k + ( n − ⌈ lg ⁡ n ⌉ ) ∗ 1 = 1 ∗ ( 1 − 2 ⌊ lg ⁡ n ⌋ + 1 ) 1 − 2 + n − ⌈ lg ⁡ n ⌉ = 2 ⌊ lg ⁡ n ⌋ + 1 − 1 + n − ⌈ lg ⁡ n ⌉ = ≤ 3 n − ⌈ lg ⁡ n ⌉ − 1 = O ( n ) \begin{aligned} S&=\sum_{k=0}^{⌊\lg n⌋}2^k+(n-⌈\lg n⌉)*1\\ &=\cfrac{1*(1-2^{⌊\lg n⌋+1})}{1-2}+n-⌈\lg n⌉\\ &=2^{⌊\lg n⌋+1}-1+n-⌈\lg n⌉\\ &=\le3n-⌈\lg n⌉-1\\ &=O(n) \end{aligned} S=k=0lgn2k+(nlgn⌉)1=121(12lgn+1)+nlgn=2lgn+11+nlgn=≤3nlgn1=O(n)
所以每个操作的摊还时间代价为 O ( n ) n = O ( 1 ) \cfrac{O(n)}{n}=O(1) nO(n)=O(1)

核算法

设每个操作的代价都为 3 3 3
2 k − 1 + 1 到第 2 k − 1 2^{k-1}+1到第2^{k}-1 2k1+1到第2k1个操作为非2的幂,多付的代价为 2 ∗ ( 2 k − 1 − 1 − 1 + 1 ) = 2 k − 2 2*(2^{k-1}-1-1+1)=2^k-2 2(2k111+1)=2k2在第 2 k 2^k 2k个次操作付的代价为 3 3 3,则可以用于支付第 2 k 2^k 2k次操作的信用为 2 k − 2 + 3 = 2 k + 1 > 2 k 2^k-2+3=2^k+1>2^k 2k2+3=2k+1>2k大于第 2 k 2^k 2k次操作应该付的代价,故每个操作的摊还代价为 O ( 1 ) O(1) O(1)

势能法

设势函数为
Φ ( D 0 ) = 0 Φ ( D i ) = 2 ( i − 2 lg ⁡ ⌊ i ⌋ ) \Phi (D_0) = 0\\ \Phi(D_i) = 2(i-2^{\lg⌊i⌋})\\ Φ(D0)=0Φ(Di)=2(i2lgi)

  1. 当i为2的幂时, 2 ⌊ lg ⁡ i ⌋ = i , ⌊ lg ⁡ ( i − 1 ) ⌋ + 1 = ⌊ lg ⁡ i ⌋ 2^{⌊\lg i⌋}=i,⌊\lg (i-1)⌋+1=⌊\lg i⌋ 2lgi=i,lg(i1)⌋+1=lgi
    c ^ i = c i + Φ ( D i ) − Φ ( D i − 1 ) = i + 2 ( i − 2 ⌊ lg ⁡ i ⌋ ) − 2 ( i − 1 − 2 ⌊ lg ⁡ i − 1 ⌋ ) = i + 2 i − 2 i + 2 − 2 ⌊ lg ⁡ i ⌋ + 1 + 2 ⌊ lg ⁡ i ⌋ + 1 = i − i − 2 ⌊ lg ⁡ i ⌋ + 2 ⌊ lg ⁡ i ⌋ + 1 + 2 = 2 \begin{aligned} \hat c_i&=c_i+\Phi(D_i)-\Phi(D_{i-1})\\ &=i+2(i-2^{⌊\lg i⌋})- 2(i-1-2^{⌊\lg i-1⌋})\\ &=i+2i-2i+2-2^{⌊\lg i⌋+1}+2^{⌊\lg i⌋+1}\\ &=i-i-2^{⌊\lg i⌋}+2^{⌊\lg i⌋+1}+2\\ &=2 \end{aligned} c^i=ci+Φ(Di)Φ(Di1)=i+2(i2lgi)2(i12lgi1)=i+2i2i+22lgi+1+2lgi+1=ii2lgi+2lgi+1+2=2
  2. 当i不为2的幂时, 2 ⌊ lg ⁡ ( i − 1 ) ⌋ = 2 ⌊ lg ⁡ i ⌋ 2^{⌊\lg (i-1)⌋}=2^{⌊\lg i⌋} 2lg(i1)⌋=2lgi
    c ^ i = c i + Φ ( D i ) − Φ ( D i − 1 ) = 1 + 2 ( i − 2 ⌊ lg ⁡ i ⌋ ) − 2 ( i − 1 − 2 ⌊ lg ⁡ i − 1 ⌋ ) = 1 + 2 i − 2 i + 2 − 2 ( 2 ⌊ lg ⁡ i ⌋ − 2 ⌊ lg ⁡ i − 1 ⌋ ) = 1 + 2 = 3 \begin{aligned} \hat c_i&=c_i+\Phi(D_i)-\Phi(D_{i-1})\\ &=1+2(i-2^{⌊\lg i⌋})- 2(i-1-2^{⌊\lg i-1⌋})\\ &=1+2i-2i+2-2(2^{⌊\lg i⌋}-2^{⌊\lg i-1⌋})\\ &=1+2\\ &=3 \end{aligned} c^i=ci+Φ(Di)Φ(Di1)=1+2(i2lgi)2(i12lgi1)=1+2i2i+22(2lgi2lgi1)=1+2=3
    故每个操作摊还复杂度为 O ( 1 ) O(1) O(1)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值