算法導論--平攤分析之彙集分析

在平攤分析中,執行一系列數據結構操做所須要的時間是經過對執行的全部操做求平均而得出的。數據結構

平攤分析能夠用來證實在一系列操做中,經過對全部操做求平均以後,即便其中單一的操做具備較大的代價,平均代價仍是很小的。平攤分析與平均狀況分析的不一樣之處在於它不牽涉到機率;平攤分析保證在最壞狀況下,每一個操做具備平均性能。函數

彙集分析性能

在彙集分析中,要證實對全部的n,由n個操做所構成的序列的總時間在最壞狀況下爲T(n)。所以,在最壞狀況下,每一個操做的平均代價(或稱平攤分析)爲T(n)/n。請注意這個平攤代價對每一個操做都是成立的,即便當序列中存在幾種類型的操做時也是同樣的。spa

棧操做對象

 在關於彙集分析的第一個例子中,咱們要分析增長了一個新操做後的棧。有兩種基本的棧操做,每種操做的時間代價都是O(1):blog

PUSH(S,x):將對象x壓入棧S。循環

POP(S):彈出S的棧頂返回彈出的對象。im

由於這兩個操做的運行時間都爲O(1),故能夠把每一個操做的代價都視爲1。所以,含n個PUSH和POP操做的序列的總代價爲n,而這n個操做的實際運行時間就是O(n)。數據

如今咱們增長一個棧操做MULTIPOP(S,k),它的做用是彈出棧S的k個棧頂對象,或者,當棧包含少於k個對象時,彈出整個棧中的數據對象。img

當MULTIPOP(S,s)對一個包含s個對象的棧操做時,運行時間是多少?實際的運行時間與實際執行的POP操做數成線性關係,於是只要按PUSH和POP具備抽象代價1來分析MULTIPOP就足夠了。while循環迭代的次數是從棧中彈出的對象個數min(s,k)。對循環的每次迭代,都要調用一次POP。所以,MULTIPOP的總代價是min(s,k),而實際運行時間則爲這個代價的一個線性函數。

如今來分析一個由n個PUSH,POP和MULTIPOP操做構成的序列,其做用於一個初始爲空的棧。序列中一次MULTIPOP操做的最壞狀況代價爲O(n),由於棧的大小至多爲n。所以,任意棧操做的最壞狀況時間就是O(n),所以n個操做的序列的代價是O(n^2),由於可能會有O(n)個MULTIPOP操做,每一個的代價都是O(n)。雖然這一分析是正確的,但經過單獨地考慮每一個操做的最壞狀況代價而獲得的O(n^2)結論倒是不夠緊確的。

利用匯集分析,咱們能夠得到一個考慮到n個操做的整個序列的更好的上界。事實上,雖然一次MULTIPOP操做的代價可能較高,但看成用於一個初始爲空的棧上時,任意一個包含n個PUSH,POP和MULTIPOP操做的序列其代價至多爲O(n)。爲何會是這樣呢?一個對象在每次被壓入棧後,至多被彈出一次。因此,在一個非空棧上,調用POP的次數(包括在MULTIPOP的調用)至多等於PUSH操做的次數,即至多爲n。對任意的n值,包含n個PUSH,POP和MULTIPOP操做的序列的總時間爲O(n)。每一個操做的平均代價爲O(n)/n=O(1)。在彙集分析中,咱們把每一個操做的平攤代價指派爲平均代價。因此在這個例子中,三個棧操做的平攤代價都是O(1)。

咱們再一次強調,雖然已經說明一個棧操做的平均代價和運行時間是O(1),但沒有用到機率推理。實際上,咱們給出的是一列n個操做的最壞狀況界O(n)。用n除這個總代價可得每一個操做的平均代價,亦即平攤代價。

相關文章
相關標籤/搜索