平攤分析這一章,clrs的英文版一直沒有讀懂,不知道是不是心太浮了。今天把中文版的拿出來再讀一讀,希望愚鈍的頭腦能開一開竅。
這一部分總標為高階分析技巧,想來也不是那麼好理解的,所以一遍不懂就再來一遍,百遍之內定能見其義了!
在amortized analysis中,執行一系列資料結構操作(push, pop, multipop, etc)所用時間是通過對執行的所有操作(n個這樣的操作)求平均得出的。平攤分析可以用來證明在一系列操作中,通過對所有操作求平均之後即使其中單一操作具有較大的代價,平均代價還是很小的。
常用的平攤分析有3種:
聚集分析(aggregate analysis)。用於確定一組n個操作序列的總代價的上界t(n)。這樣每個操作的平均代價就是t(n)/n。把平均代價當作每個操作的平攤代價,因此所有的操作有相同的平攤代價。
記帳方法(accouting method)。其中要確定每個操作的平攤代價。每種操作都可有乙個不同的平攤代價。這種方法對操作序列中的某些操作先「多記帳」,將多記的部分作為對資料結構中的特定物件上「預付的存款(prepaid credit)」存起來。在該序列中稍後將用到這些存款,以補償那些對它們記的「賬」少於其實際代價的操作。
勢能方法(potential method)。與記賬方法的相似之處在於要確定每個操作的平攤代價,而且可能先對操作多記賬以補償以後的不足記賬。這種方法將存款作為資料結構整體的「勢能」來維護,而不是將存款與資料結構聽單個物件聯絡起來。
(note: 平攤分析中所記的「賬」只是為了分析所用,它們不必要也不應該出現在**中。)
一、aggregate analysis
在這種分析中要證明對所有的n,由n個操作所構成的序列的總時間在最壞情況下為t(n)。因些每個操作的平均代價(平攤代價,amortized cost)為t(n)/n。
[example]
棧操作,在棧已有的兩個操作(push(s,x)和pop(s))上增加乙個multipop(s,k),作用是彈出棧s的k個棧頂物件噹噹(少於k個則全部彈出)。push和pop的執行時間都是o(1),故n個push和pop操作的序列的總代價為\theta(n)。multipop(s,s)的代價為min(s,k), k為棧中元素個數。
考慮乙個n個操作(由push,pop,multipop組成)的整個序列的較好的上界。事實上,雖然一次multipop操作的代價可能較高,但當作用於乙個初始為空的棧上時上時,任意乙個包含n個push,pop和multipop操作的序列其代價至多為o(n),因為乙個物件每次入棧後至多只能被彈出一次,所以在乙個非空棧上呼叫pop的次數(包含在multipop中呼叫的)至多等於push操作的次數,也就是最多n次。因些對任意的n個push,pop,multipop操作的序列的總時間為o(n)。每個操作的平均代價為o(n)/n = o(1)。在聚集分析中,把每個操作的平攤代價指派為平均代價。所以這三個棧操作的平攤代價都是o(1)。
二、accounting method
在記賬方法中我們對不同的操作賦予不同的費用,某些操作的費用比它們的實際代價或多或少。對乙個操作的收費的數量稱為平攤代價。當乙個操作的平攤代價超過它的實際代價時,兩者的差被作為存款(credit),並賦予資料結構中的一些特定物件。存款可以在以後用於補償那些其平攤代價低於其實際代價的操作。這樣我們可以將乙個操作的平攤代價看作兩部分:其實際代價與存款(或被儲蓄或被用完)。
如果希望通過對平攤代價的分析來說明每次操作的最壞情況平均代價較小,則操作序列的總的平攤代價就必須是該序列的總的實際代價的乙個上界。且這種關係必須對所有的操作序列都成立。
記由這個不等式可以知道資料結構中的總存款不能是負的。
[example]仍以棧操作(push,pop,multipop)為例,對它們賦予以下的平攤代價:
push 2,
pop 0,
multipop 0,
注意三個平攤代價都是o(1)。
我們需要說明的是,通過這種平攤代價收費,可以支付任何的棧操作序列(即使得總的存款非負)。因為每個push操作都將產生花費1(即push的實際操作),同時產生1的存款(2-1=1)。而pop操作將產生1的花費,這只能從push產生的存款中取得,對multipop的每個pop操作也如此。這樣對任意的n,總的存款都非負。因些總的平攤代價是o(n),總的實際代價也是o(n)。
啊,這樣寫好累啊,明天再寫potential method吧...
平攤分析 Amortized analysis
今天我們主要討論所謂的平攤分析 amortized analysis 它是用來分析一系列操作的平均所需要的代價。可能有人會問它利用概率論的知識,通過概率來求平均情況。答案是否定的,它並不涉及概率。在一些情況下平攤分析能夠很好的幫助我們分析我們程式的代價或者消耗。這部分主要有三個內容,如圖所示 聚合分...
平攤分析 演算法導論讀書筆記
我們經常會說乙個演算法快不快,這個可以由實驗得出,也可以通過分析複雜度得出。實驗需要大量不同的輸入才更全面準確,否則片面地看某個輸入下的表現,是比較偏頗的。分析複雜度 通常分析最壞,因為平均涉及輸入的概率分布,依靠假設或者實驗和經驗 有時候並不是乙個簡單的事,簡單的情況是遍歷 for int i 0...
二叉樹平攤
將一顆二叉樹平攤開來,如下 1 2 5 3 4 6 the flattened treeshould look like 1 2 3 4 5 6 思路 對每個節點,將左節點賦給右節點,同時用遞迴將左節點 flat 然後返回的 flat 的尾部,將右節點加在尾部的右節點上,並再用遞迴將其 flat 一...