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

2021-06-28 16:06:50 字數 2007 閱讀 9088

習題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,消耗信用為i-1,若n足夠大,可知每個操作的攤還代價為3。

習題11.3-2 勢能法解上題。定義勢函式φ(di)=2i,從第i/2個操作到第i個操作,每次實際代價1,勢總共增加了i,第i個操作付出代價i,降低勢到了1。當n足夠大,每次操作攤還代價為3。

習題11.3-3 n個元素的二叉最小堆的攤還分析。φ(di)= σ lg(i)。則第i個元素的插入操作的攤還代價為o(lg(i)),第i個元素的刪除操作攤還代價為o(1).

習題11.3-6 兩個普通的棧實現乙個佇列,出入操作攤還代價為o(1)。通常用兩個棧實現乙個佇列的方法是將棧裡的元素來回倒,但是全部元素從乙個棧倒入另乙個棧的代價是o(n),所以我們不能頻繁的來回倒。應該是在必要的時候才倒。stacka, stackb分別是兩個棧,enqueue操作實際放在stacka, dequeue操作放在stackb,dequeue時若stackb為空,則將stacka元素倒入stackb。定義勢能φ(di)=a.length,每個enqueue操作實際代價1,增加勢能1,當b清空時,a的元素全部倒入b,勢能為0.所以enqueue和dequeue的攤還代價都為o(1)。

enqueue(x)

dequeue()

do while(!a.empty() )

} return b.pop();

}

習題11.3-7 計數排序。勢函式為φ(t)=c*s.size,插入時實際代價為o(1),勢增長c,刪除一半的元素時,勢減少一半,代價為o(|s| )。全部刪除後,勢為0。 所以插入、刪除的攤還代價為o(1),而輸出所有元素的代價為o(|s|)。

insert(x)

delete_half(s)

i--;

} update largest_element;

}

習題17.4-1 動態開位址雜湊表的攤還分析。勢函式φ(d) = (1+1/a)*t.n-t.size。當n=size*a時,勢為t.size,此時將**擴張一倍,舊表複製到新錶,消耗代價為t.n,勢回到0.所以,每次插入操作的攤還代價是o(1)。

思考題17-2 search時也是按照2分,需要有乙個將整個陣列上的序數m對映到陣列ai中第j個元素的方法。根據n的二進位制,從ak-1第1個元素開始查詢,向前查詢則跳到ak-2的第乙個元素,向後查詢則是ak-1中間位置的元素。最壞執行時間仍然是o(lg n )。插入t時,找到應該插入的ai的j位置,但是有可能從ai開始向前乙個子陣列ai-1移動乙個數字,如果子陣列都用鍊錶實現,包括移動元素與鍊錶的合併與分拆,最多需要o(lg n )。刪除也是一樣,找到ai的位置j,刪除,如果需要則鍊錶合併與分拆,最壞情況為o(lg n )。

思考題17-3 定義兩個方法,left_element(),right_element(),分別返回x結點左、右側數值最接近x的元素。當左邊需要向右調整時,將x.left_element()移動到x的位置,x移動到x.right_element()的右側。然後對移動後的子樹從底向上調整平衡。最壞的效能是o(x.size),因為移動一次就將x的左右子樹調節一次,而對子樹的遞迴操作最壞情況下會導致對所有結點都調整一次。

勢函式φ(t)=c σ | x.left.size-x.right.size |,1/2平衡樹所有的δx都為0。m個結點加入a為引數的平衡樹,重建成本為o(t.size),勢至少是c*( a*size-(1-a)*size ),則有c*(2a-1)size > n* size,c > 1 / (2a-1)才能使插入的攤還時間為o(1)。

插入成本lg n, 不需調整的情況下插入的路徑上的根結點δx變化+/-1,勢增量o(lg n ),而需要調整的情況下,勢增量o(lg n )+ o(size )減去調整開銷o(size )。則攤還成本為o(lg n )。刪除操作也是同理。

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

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

攤還分析 1 演算法導論 23

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

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

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