假定我们对一个数据结构执行一个由 n 个操作组成的操作序列,当 i 严格为 2 的幂时,第 i 个操作的代价为 i,否则代价为 1
聚合分析
总共有n个操作,
1
,
2
,
4.....
,
2
⌊
lg
n
⌋
1,2,4.....,2^{⌊\lg n⌋}
1,2,4.....,2⌊lgn⌋,其中有至多
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=0∑⌊lgn⌋2k+(n−⌈lgn⌉)∗1=1−21∗(1−2⌊lgn⌋+1)+n−⌈lgn⌉=2⌊lgn⌋+1−1+n−⌈lgn⌉=≤3n−⌈lgn⌉−1=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
2k−1+1到第2k−1个操作为非2的幂,多付的代价为
2
∗
(
2
k
−
1
−
1
−
1
+
1
)
=
2
k
−
2
2*(2^{k-1}-1-1+1)=2^k-2
2∗(2k−1−1−1+1)=2k−2在第
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
2k−2+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(i−2lg⌊i⌋)
- 当i为2的幂时,
2
⌊
lg
i
⌋
=
i
,
⌊
lg
(
i
−
1
)
⌋
+
1
=
⌊
lg
i
⌋
2^{⌊\lg i⌋}=i,⌊\lg (i-1)⌋+1=⌊\lg i⌋
2⌊lgi⌋=i,⌊lg(i−1)⌋+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)−Φ(Di−1)=i+2(i−2⌊lgi⌋)−2(i−1−2⌊lgi−1⌋)=i+2i−2i+2−2⌊lgi⌋+1+2⌊lgi⌋+1=i−i−2⌊lgi⌋+2⌊lgi⌋+1+2=2 - 当i不为2的幂时,
2
⌊
lg
(
i
−
1
)
⌋
=
2
⌊
lg
i
⌋
2^{⌊\lg (i-1)⌋}=2^{⌊\lg i⌋}
2⌊lg(i−1)⌋=2⌊lgi⌋
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)−Φ(Di−1)=1+2(i−2⌊lgi⌋)−2(i−1−2⌊lgi−1⌋)=1+2i−2i+2−2(2⌊lgi⌋−2⌊lgi−1⌋)=1+2=3
故每个操作摊还复杂度为 O ( 1 ) O(1) O(1)