演算法導論習題解 第17章攤還分析

2021-06-22 22:47:37 字數 1092 閱讀 6721

相當於每月領取一定的零花錢,用來支付實際費用,只要在任何時候餘額不為負。那麼總花費一定不超過總的零花錢。必須條件,同時也是缺點:任何時候餘額不為負。

條件比記賬法寬鬆。對於資料結構的每個狀態,定義乙個勢能p(i),第i步操作的攤還代價記為a[i] = c[i] + p(i)-p(i-1),只要p(n) >= p(0),攤還代價就不會超過實際代價。即用前面積累起來的勢能支付後面代價較大的操作。

習題編號以第三版為準。

對乙個資料結構執行由n個操作組成的序列,當i為2的冪時,第i個操作的代價為i,否則為1。分別使用聚合分析(#17.1-3),記賬法(#17.2-2)和勢能法(#17.3-2)分析攤還代價。

解:實際就是動態擴張表,當容量為2的冪時,容量加倍。見課本17.4節對動態表的分析。記賬法:每個操作攤還代價記為3。勢能法:potential(i) = 2*(i-maxp2)其中maxp2是不超過i的最大的2的冪,比如potential(8)=0, potential(9)=2, ... potential(15)=14

解:實際就是通過位操作實現課本中的二進位制計數器,只不過自增是從左向右進行而不是從右向左。由課本中的分析可知,自增操作的平攤代價為o(1)。普通計數器**如下:

public class counter 

n |= b;

return n;

}public static void main(string args)

}}

見instructor's manual

解:(d) 設左子樹大小為a*n,右子樹為(1-a)*n,則勢能p(n) >= c(a*n - (1-a)*n),由於平衡的成本為n,只需p(n) > n那麼就可以用勢能支付平衡成本。即c > 1/(2*a - 1)

(e) 假設插入後不需要重新平衡,插入成本lg(n),插入後勢能的變化最多為2*lg(n),因為只有在插入的路徑上δ才會變化,每個節點最多變化2,故平攤成本為o(lg n)。假設需要平衡,則插入及平衡成本為lg(n)+n,勢能變化為p(n)-p(n-1) = 0 - p(n-1) < 0 - c(2*a-1)*n = -n,故平攤成本為 lg(n)+n+p(n)-p(n-1) < lg(n)+n-n = lg(n)

演算法導論第17章 攤還分析

在攤還分析中,我們求資料結構的乙個操作序列中所執行的所有操作的平均時間,來評價操作的代價,從而說明乙個操作的平均代價是很低的,即使序列中某一單一操作的代價很高,不涉及改了,但可以保證最壞情況下每個操作的平均時間。攤還分析中主要的三種方法 1 聚合分析 2 核算法 即記賬法 3 勢能法 1 聚合分析 ...

《演算法導論》筆記(11) 攤還分析 部分習題

習題11.1 3 i為2的冪時代價為i,其餘代價為1,聚合分析 1 2 1 4 1 1 1 8.n,若n趨近無窮大,極限為3。每次操作攤還代價為3.習題11.2 2 核算法解上題。在i 2 1到第i 1次操作之間,每次操作實際代價1,信用2,經過i 2次之後,累積信用為i,第i個操作一次性付出代價i...

攤還分析 1 演算法導論 23

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