摊还分析
攤還分析
1何為攤還分析?
攤還分析主要求解數據結構維護序列執行的所有操作的平均時間,來評價操作的代價,從而保證最壞情況下每個操作的平均性能。
2聚合分析
2.1何為聚合分析?
若長度為n的操作序列最壞情況下所花費時間為T(n)。
聚合分析狀態下,攤還代價C=T(n)/n。
2.2棧的時間復雜度分析
此時棧有3個操作:
1.PUSH(S,x)表示將對象x壓入棧中。
2.POP(S,x)表示從棧頂彈出一個元素(保證不會彈空)。
3.MULTIPOP(S,k)表示彈出棧頂的k個元素(保證不會彈空)。
試證明單次操作的攤還代價。
一次POP的最壞時間是O(n)的,那么n個操作的時間是否是O(n^2)的呢?
?
其實不然。
證明:事實上,每一個元素只入棧一次,出棧一次,而棧中最多存在n個元素,所以n次操作最壞只需要O(n)的時間。而每個操作的攤還代價C=O(n)/n=O(1)。
2.3單調隊列的時間復雜度分析
單調隊列也有兩個操作:
1.PUSH(que,x)表示在隊尾插入。
2.POP(que,k)表示在隊首彈出k個元素(保證不會彈空)。
試證明單次操作的攤還代價。
證明:每個元素依然只入隊一次,出隊一次,最多n個元素,最壞為O(n),每個操作的攤還代價C=O(n)/n=O(1)
3.核算法
3.1何為核算法?
我們進行攤還分析時,對每一個不同的操作賦予不同的費用,將賦予一個操作的費用稱為它的攤還代價。
每一次攤還代價超出實際代價時,就可以將多出的部分“儲存”起來,稱之為“信用”,它在以后的操作中可以“抵賬”。
?
但核算法應確保總攤還代價大于總真實代價的上界。如果用ci表示第i個操作的真實代價,?i表示第i個操作的攤還代價,要求
也就是
在保證信用非負的情況下,總攤還代價是總真實代價的上界。
?
3.2棧的核算法分析
還是剛才棧的例子。
它的每個操作的實際代價為:
PUSH ? ? ? ? ? ?1
POP ? ? ? ? ? ? ?1
MULTIPOP ? ?k
我們賦予每個操作這樣的攤還代價:
?
PUSH ? ? ? ? ? ?2
POP ? ? ? ? ? ? ?0
MULTIPOP ? ?0
可證明對于任意的操作序列,總攤還代價大于總實際代價。
就相當于每一次PUSH存入2元,1元當做PUSH的代價,還有1元當做將來彈出這個元素的代價。這樣可以保證信用永遠非負,之前PUSH多付出的攤還代價預支了以后POP需要的代價。所以在POP是可以當作沒有任何代價了。總攤還代價還是O(n)的。
3勢能法
3.1何為勢能法?
勢能法沒有將預支代價表示為特定操作的信用,而是表示為“勢能”,用勢能的釋放預支代價。勢能與整個數據結構對象相關聯,而非像核算法一樣和某個特定的操作代價相關聯。
我們將一個初始數據結構D0執行n個操作。對于每一個操作i,令ci為第i個操作的實際代價,令Di為數據結構Di-1上執行第i個操作所得到的結果數據結構。勢函數φ把每個數據結構表示為一個勢能大小。
?
攤還代價:?i=ci+φ(Di)-φ(Di-1)
每個操作的攤還代價為實際代價+勢能變化。
總攤還代價:
? ? ? (3.1.1)
需要定義φ使得φ(Dn)>=φ(D0),那么總攤還代價會是總實際代價的上界,因此我們要求φ(Di)>=φ(D0),一般把φ(D0)定義為0,只需要保證φ(Di)>=0即可。
3.2棧的勢能法分析
棧的操作同上。
我們設φ(Di)表示i次操作后棧中的元素數量s。
D0初始為空棧。φ(D0)初始為0.
1.對于PUSH(S,x),φ(Di)-φ(Di-1)=(s+1)-s=1。由公式(3.1.1)可得,?i=ci+φ(Di)-φ(Di-1)=1+1=2
2.對于MULTIPOP(S,k),φ(Di)-φ(Di-1)=(s-k)-s=-k。由公式(3.1.1)可得?i=ci+φ(Di)-φ(Di-1)=k-k=0
同理,POP的攤還代價也為0.
綜上所述,每個操作的攤還代價均為O(1),因此總攤還代價為O(n),此時必有φ(Di)>=φ(D0)。
4.動態表擴張
你需要完成對一個序列的插入,快速查詢操作。
簡單來說就是實現C++中的vector,為其尋找一個空間為O(n)的方法。
對于這個問題,我們的方法是:每次空間存滿,擴展兩倍空間,并復制原來空間的內容進入新的空間。
(1).若使用聚合分析
ci=
1.當i-1=2^k,ci=i
2.當i-1!=2^k,ci=1
總代價為:
(2).若通過核算法。
令每一次操作的?i=3。總攤還時間為3n。
(3).若通過勢能法。
定義φ(Di)=2*T.num-T.size。
1.非擴張
?i=ci+φ(Di)-φ(Di-1)
? ?=1+(2*numi-sizei)-(2*numi-1-sizei-1)
? ?=1+(2*numi-sizei)-(2(numi-1)-sizei)
? ?=3
2.擴張
?
?i=ci+φ(Di)-φ(Di-1)
? ?=numi+(2*numi ?- ?sizei)-(2*numi-1 ? - ? sizei-1)
? ?=numi+(2*numi-2*(numi ? ?-1))-(2*(numi ? ?-1))-(numi ? ?-1)
? ? =numi+2(numi ? - 1)
? ? =3
總攤還代價為O(n)。
5.思考
如何求堆的攤還代價?
如何求AVL的攤還代價?
如何求splay的攤還代價?
6.參考文獻
算法導論
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 黄蜀葵的功效与作用、禁忌和食用方法
- 下一篇: 仙茅的功效与作用、禁忌和食用方法