算法导论摊还分析—聚合分析核算法势能法
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法导论摊还分析—聚合分析核算法势能法相关的知识,希望对你有一定的参考价值。
算法导论【摊还分析】—聚合分析、核算法、势能法
假定我们对一个数据结构执行一个由 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
)
\\beginaligned S&=\\sum_k=0^⌊\\lg n⌋2^k+(n-⌈\\lg n⌉)*1\\\\ &=\\cfrac1*(1-2^⌊\\lg n⌋+1)1-2+n-⌈\\lg n⌉\\\\ &=2^⌊\\lg n⌋+1-1+n-⌈\\lg n⌉\\\\ &=\\le3n-⌈\\lg n⌉-1\\\\ &=O(n) \\endaligned
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
)
\\cfracO(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 \\beginaligned \\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 \\endaligned 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⌊lg算法导论习题—摊还时间代价分析栈实现队列贪心算法近似比集合覆盖问题