算法导论习题—摊还时间代价分析栈实现队列贪心算法近似比集合覆盖问题

Posted 之墨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法导论习题—摊还时间代价分析栈实现队列贪心算法近似比集合覆盖问题相关的知识,希望对你有一定的参考价值。

在执行的 n n n个操作中,有至多 ⌈ l g n ⌉ ⌈lg n⌉ lgn个操作的次序是 2 2 2的幂,这些操作的次序(即代价)如下
1 , 2 , 4 , 8 , ⋅ ⋅ ⋅ , 2 ⌈ l g n ⌉ 1, 2, 4, 8, · · · , 2 ⌈lg n⌉ 1,2,4,8,,2lgn
n n n个操作的总代价为
T = ∑ k = 0 ⌈ l g n ⌉ 2 k + ( n − ⌈ l g n ⌉ ) × 1 = 2 ⌈ l g n ⌉ + 1 − 1 + ( n − ⌈ l g n ⌉ ) ≤ 2 lg ⁡ n + 2 + n − l g n = 3 l g n + n \\beginaligned T&=\\sum^⌈lg n⌉_k=02^k + (n − ⌈lg n⌉) × 1\\\\ &=2^⌈lg n⌉+1 − 1 + (n − ⌈lg n⌉)\\\\ &≤2^\\lg n+2 + n − lg n\\\\ &=3 lg n + n \\endaligned T=k=0lgn2k+(nlgn)×1=2lgn+11+(nlgn)2lgn+2+nlgn=3lgn+n
因此每个操作的摊还代价是 O ( 3 lg ⁡ n + n n ) = O ( 1 ) O ( \\cfrac3 \\lg n + n n ) = O(1) O(n3lgn+n)=O(1)的。

当操作次序是 2 2 2的幂时,为其赋 4 4 4的摊还代价,否则为其赋 2 2 2的摊还代价,则每一个不为 2 2 2 的幂的操作均会提供 1 1 1的信用以支付差额,对于一 个 n n n个操作组成的操作序列,有
4 × ⌈ lg ⁡ n ⌉ + 2 × ( n − ⌈ lg ⁡ n ⌉ ) = 2 × ⌈ lg ⁡ n ⌉ + 2 n ≤ 3 lg ⁡ n + n ≤ ∑ k = 0 ⌈ l g n ⌉ 2 k + ( n − ⌈ lg ⁡ n ⌉ ) × 1 \\beginaligned &4×⌈\\lg n⌉+2×(n−⌈\\lg n⌉) \\\\ &=2×⌈\\lg n⌉+2n\\\\ &≤3\\lg n+n\\\\ &≤\\sum^⌈lg n⌉_k=02^k+(n−⌈\\lg n⌉)×1 \\endaligned 4×lgn+2×(nlgn)=2×lgn+2n3lgn+nk=0lgn2k+(nlgn)×1
每个操作的摊还代价都是常数,因此摊还代价都为 O ( 1 ) O(1) O(1)

定义势函数
Φ P h i ( D i ) = 0 ,                          i = 0 1 ,                          i = 1 lg ⁡ i + 1 ,                i = 2 ⌊ lg ⁡ i ⌋ ⌊ lg ⁡ i ⌋ + k ,            i = 2 ⌊ lg ⁡ i ⌋ + k ΦPhi(D_i) =\\left\\ \\beginaligned & 0, \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ i = 0\\\\ &1, \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ i = 1\\\\ & \\lg i + 1, \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ i = 2^⌊\\lg i⌋\\\\ & ⌊\\lg i⌋ + k, \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ i = 2^⌊\\lg i⌋ + k \\endaligned \\right. ΦPhi(Di)=0,                        i=01,                        i=1lgi+1,              i=2lgilgi+k,          i=2lgi+k

则对任意的 i , Φ ( D i ) ≥ 0 i,Φ(D_i) ≥ 0 iΦ(Di)0,且
Φ ( D i ) − Φ ( D i − 1 ) = 1 − i ,          i = 2 ⌊ lg ⁡ i ⌋ 1 ,                i = 2 ⌊ lg ⁡ i ⌋ + k Φ(D_i) − Φ(D_i−1) =\\left\\ \\beginaligned & 1-i, \\ \\ \\ \\ \\ \\ \\ \\ i = 2^⌊\\lg i⌋\\\\ & 1, \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ i = 2^⌊\\lg i⌋ + k \\endaligned \\right. Φ(Di)Φ(Di1)=1i,        i=2lgi1,              i=2lgi+k
所以:
∑ i = 1 n c ^ = ∑ i = 1 n 1 = n \\sum^n_i=1\\hatc=\\sum^n_i=11=n i=1nc^=i=1n1=n
因此每个操作的摊还代价是 O ( 1 ) O(1) O(1)

使用两个栈实现队列,将两个栈记为左右栈。

ENQUEUE \\textENQUEUE ENQUEUE:直接对左栈进行 push \\textpush push将元素入队

DEQUEUE \\textDEQUEUE DEQUEUE:如果右栈非空,对右栈进行 pop \\textpop pop以上是关于算法导论习题—摊还时间代价分析栈实现队列贪心算法近似比集合覆盖问题的主要内容,如果未能解决你的问题,请参考以下文章

[算法导论]#1 摊还分析

算法导论

《算法导论》读书笔记

《算法导论》读书笔记

人工智能导论期末复习合集

日常算法练习题用两个栈实现队列(每天进步一点点系列)