《演算法導論》第十七章——攤還分析
雖然寫這個部落格主要目的是為了給我自己做一個思路記憶錄,但是如果你恰好點了進來,那麼先對你說一聲歡迎。我並不是什麼大觸,只是一個菜菜的學生,如果您發現了什麼錯誤或者您對於某些地方有更好的意見,非常歡迎您的斧正!
在攤還分析中,我們求資料結構的一個操作序列中所執行的所有操作的平均時間,來評價操作的代價。
17.1聚合分析
利用聚合分析,我們證明對所有n,一個n個操作的序列最壞情況下話費的總時間為T(n)。因此在最壞情況下,每個操作的平均代價,或攤還代價為T(n)/n。
棧操作
Push(S,x):將物件x壓入棧中
Pop(S):將棧S的棧頂物件彈出,並返回該物件
現在增加一個新的操作:MultiPop(S,k):刪除棧S棧頂的k個物件,如果棧中物件數少於k,則將整個棧的內容全部彈出。
通過使用聚合操作,我們考慮整個序列的n個操作,可以得到更好的商界。實際上,雖然一個單獨的MultiPop操作可能代價更高,但是在一個空棧上執行n個Push、Pop和MultiPop的操作序列,代價最多為O(n)。因為當一個物件壓入棧後,最多隻能彈出一次。所以,對任意的n值,任意一個由n個Push、Pop和MultiPop組成的操作序列,最多花費O(n)時間。一個操作的平均花費時間為O(n)/n=O(1)。
二進位制計數器遞增
執行的時候要通過for迴圈呼叫這個函式才能實現我們的目的。
17.2核算法
用核算法進行攤還分析時,我們對不同操作賦予不同費用,賦予某些操作的費用可能多於或少於其實際代價。我們將賦予一個操作的費用稱為它的攤還代價。但跟一個操作的攤還代價超出其實際代價時,我們將差額存入資料結構中的特定物件,存入的差額稱為信用。對於後續操作中攤還代價小於實際代價的情況,信用可以用來支付差額。
必須注意保持資料結構中的總信用永遠為非負值。
17.3勢能法
勢能法攤還分析並不將預付代價表示為資料結構中特定物件的信用,而是表示為“勢能”,簡稱“勢”,將勢能釋放即可用來支付未來操作的代價。
17.4動態表
雖然插入和刪除操作可能會引起擴張或收縮,從而有較高的實際代價,但它們的攤還代價都是O(1)。
Table_Insert將一個數據項插入表中,它佔用一個槽,即儲存一個數據項的空間。
Table_Delete從表中刪除一個數據項,從而釋放一個槽。
非空表T的裝載因子α(T):表中儲存的資料項的數量/表的規模(槽的數量)。
17.4.1表擴張
17.4.1表擴張和收縮
理想情況下,我們希望儲存兩個性質:
·動態表的裝載因子有一個正的常數的下界
·一個表操作的攤還代價有一個常數上界