演算法設計與分析課堂筆記(2)攤還分析

2021-10-05 03:38:44 字數 1725 閱讀 1316

核分析勢能分析

總結當我們在設計乙個資料結構時,評估乙個資料結構操作的複雜度可能會成為乙個問題;

考慮這樣一種情況:資料結構中特定操作的複雜性很高,但是實際用到的機會不多,所以和其他操作的複雜性「平攤」一下,從整體上講該資料結構使用起來複雜性就降低了。

因為資料結構上的操作相互之間可能是有關聯的。不考慮操作之間的關聯,只盯著資料結構中特定的乙個操作來分析其複雜性,得到的結果往往是不夠緊的上界。

由此我們意識到:分析資料結構操作的複雜性應當從整體上入手。但在多個操作關聯的基礎上進行複雜度分析,還是比較難做到的。攤還分析主要想解決的就是這一類分析問題。

首先我們需要明確一下問題的定義:針對特定的資料結構s,s具有若干操作,在s上進行任意n個操作,求這個操作序列的複雜度。;就是說,我們接下來需要得到的最終結果應該是操作序列的乙個盡可能緊的上界(作為整體效能的指標)。

另外我們還需要區分開實際代價攤還代價

有關攤還分析的具體內容均可查閱《演算法導論》第17章,以下僅針對書中介紹的三種方法,做出個人的理解。

聚合分析基於這樣乙個淳樸的思想:在所有可能操作的複雜度中,選取乙個最大的複雜度指定為所有操作的「攤還代價」。這樣選出的攤還代價絕對不小於每個操作的實際代價。那麼將全部n個操作的攤還代價加起來,得到的就是實際操作序列複雜度的乙個上界。

我們看到《演算法導論》中,針對兩個例子都先給出了乙個「正確但是上界不夠緊湊」的解法;之後又都給出了乙個不太明顯,但是結果更好的解法。

二者其實都是聚合分析的應用,只是說前者沒有考慮各個操作的關聯性,而後者有考慮操作之間的關聯性。

拿「棧操作」的例子說明一下二者的區別:

我們可以看出,按簡單的思路運用聚合分析,如果沒有考慮到操作之間的關聯性的話,得到的上界是比較松的;在考慮了關聯性之後,可以得到好的結果。

但是,和接下來的兩種方法相比,用聚合分析時,關聯性並不是那麼好分析,而且太依賴於直覺。

我們想要這樣的方法:我們可以規定一種機制,而不是依賴於直覺和靈感。當我們為各個操作指定的攤還代價滿足這個機制要求的條件時,可以保證得到的結果為任意的操作序列的上界,而且通常有比較好的結果。下面兩種方法都做到了這點。

核分析也被稱為會計分析。它通過預先指定每個操作的攤還代價,並設定一種在資料結構中「儲存」餘額的機制,證明設定的合理性後,就可以利用攤還代價來分析操作序列的總攤還代價,從而得到總實際代價的複雜度上界。

該方法有幾個要注意的點:

比如在棧操作中,pop是增加儲存單元的操作,所以指派攤還代價更多;而push和multipush為刪除儲存單元的操作,所以指派的攤還代價更少;另外注意到,攤還代價可以少於實際代價,也可以多於實際代價。而且分析都是從資料結構為空,存款為0的情況開始分析的;

在資料結構的所有狀態構成的集合上定義乙個到實數集的對映,我們稱乙個狀態對映到的實數即為資料結構為該狀態時,對應的勢。我們將乙個操作的實際代價和其引起的資料結構勢的變化的和稱為該操作對應的攤還代價。這樣,我們只要保證操作序列結束狀態的勢不小於初始狀態的勢,就可以得出總攤還代價為總實際代價的上界。

一般來說,勢能分析是三種攤還分析方式中運用最廣的,前兩種基本只存在於教科書中,但是理解它們的思想有利於攤還分析整體思路的理解。

演算法導論學習筆記之攤還分析

在攤還分析中,我們求資料結構的乙個操作序列中所執行的所有操作的平均時間,來評價操作的代價。這樣,就可以說明即使乙個序列的某個操作很複雜,平均代價還是很低的。攤還分析中最常用三種技術 聚合分析,這種方法用來確定乙個n個操作的序列的總代價的上界t n 因而每個操作的代價是t n n,將平均代價作為每個操...

攤還分析,核算法與勢能法

上篇文章我們提到了演算法的時間複雜度分析,給定輸入規模,我們分析出演算法的耗時,但是這樣夠了嗎?有時輸入規模不是乙個靜態的值,可能輸入是一系列操作,比如在這棵樹里先插入結點,再做乙個查詢,再刪除最小值,再與另一棵樹合併。插入,查詢,刪除最小值,合併 就是乙個輸入的操作序列。為了對這類操作序列耗時進行...

攤還分析 1 演算法導論 23

攤還分析 amortized analysis 是一種分析乙個操作序列中所執行的所有操作的平均時間分析方法。與一般的平均分析方法不同的是,它不涉及概率的分析,可以保證最壞情況下每個操作的平均效能。下面介紹癱瘓分析中的最常用的三種技術。先來看對棧進行操作的例子。通常,棧能夠進行push s,x 與po...