《演算法導論(原書第3版)》一思考題

2021-09-23 08:19:27 字數 1920 閱讀 5048

2-1 (在歸併排序中對小陣列採用插入排序) 雖然歸併排序的最壞情況執行時間為θ(nlgn),而插入排序的最壞情況執行時間為θ(n2),但是插入排序中的常量因子可能使得它在n較小時,在許多機器上實際執行得更快。因此,在歸併排序中當子問題變得足夠小時,採用插入排序來使遞迴的葉變粗是有意義的。考慮對歸併排序的一種修改,

39其中使用插入排序來排序長度為k的n/k個子表,然後使用標準的合併機制來合併這些子表,這裡k是乙個待定的值。

a.證明:插入排序最壞情況可以在θ(nk)時間內排序每個長度為k的n/k個子表。

b.表明在最壞情況下如何在θ(nlg(n/k))時間內合併這些子表。

c.假定修改後的演算法的最壞情況執行時間為θ(nk+nlg(n/k)),要使修改後的演算法與標準的歸併排序具有相同的執行時間,作為n的乙個函式,借助θ記號,k的最大值是什麼?

d.在實踐中,我們應該如何選擇k?

2-2 (氣泡排序的正確性) 氣泡排序是一種流行但低效的排序演算法,它的作用是反覆交換相鄰的未按次序排列的元素。

bubblesort(a)

1 for i = 1 to a.length - 1

2   for j = a.length downto i + 1

3     if a[j] < a[j - 1]

4       exchange a[j] with a[j - 1]

a.假設a′表示bubblesort(a)的輸出。為了證明bubblesort正確,我們必須證明它將終止並且有:

a′[1]≤a′[2]≤…≤a′[n](2.3)

其中n=a.length。為了證明bubblesort確實完成了排序,我們還需要證明什麼?

下面兩部分將證明不等式(2.3)。

b.為第2~4行的for迴圈精確地說明乙個迴圈不變式,並證明該迴圈不變式成立。你的證明應該使用本章中給出的迴圈不變式證明的結構。

c.使用(b)部分證明的迴圈不變式的終止條件,為第1~4行的for迴圈說明乙個迴圈不變式,該不變式將使你能證明不等式(2.3)。你的證明應該使用本章中給出的迴圈不變式證明的結構。

40d.氣泡排序的最壞情況執行時間是多少?與插入排序的執行時間相比,其效能如何?

2-3 (霍納(horner)規則的正確性) 給定係數a0,a1,…,an和x的值,**片段

1 y = 0

2 for i = n downto 0

3   y = ai + x·y

實現了用於求值多項式

p(x)=∑nk=0akxk=a0+x(a1+x(a2+…+x(an-1+xan)…))

的霍納規則。

a.借助θ記號,實現霍納規則的以上**片段的執行時間是多少?

b.編寫偽**來實現樸素的多項式求值演算法,該演算法從頭開始計算多項式的每個項。該演算法的執行時間是多少?與霍納規則相比,其效能如何?

c.考慮以下迴圈不變式:

在第2~3行for迴圈每次迭代的開始有

y=∑n-(i+1)k=0ak+i+1xk

把沒有項的和式解釋為等於0。遵照本章中給出的迴圈不變式證明的結構,使用該迴圈不變式來證明終止時有

y=∑nk=0akxk。

d.最後證明上面給出的**片段將正確地求由係數a0,a1,…,an刻畫的多項式的值。

2-4 (逆序對) 假設a[1..n]是乙個有n個不同數的陣列。若ia[j],則對偶(i,j)稱為a的乙個逆序對(inversion)。

a.列出陣列〈2,3,8,6,1〉的5個逆序對。

41b.由集合中的元素構成的什麼陣列具有最多的逆序對?它有多少逆序對?

c.插入排序的執行時間與輸入陣列中逆序對的數量之間是什麼關係?證明你的回答。

 《計算機程式設計藝術》第1卷第3版英文影印版已由機械工業出版社出版,isbn 978-7-111-22709-0。——編輯注

 《計算機程式設計藝術》第3卷第2版英文影印版已由機械工業出版社出版,isbn 978-7-111-22717-5。——編輯注

演算法導論第21章思考題

給定乙個操作序列,包括insert x 和extract min,運算元x 1,n 4,8,e,3,e,9,2,e,e 將第i次extract min的數儲存在extract i 中 建立乙個優先佇列,給定乙個操作,馬上在優先佇列中做出相應改變即可 演算法解釋 將樣例輸入看成s1,e,s2,e,s3...

演算法導論 思考題 4 3

a.利用主方法可得,t n n的log3 4次方 b.n f n lgn,不能應用主方法 共log3 n 1層,每層代價n lg n 3 的i次方 最後一層共n個 1 的結點,代價為 n t n n lg n 3 的i次方 n n lgn n n log3 2 n o n 又因為t n 最後一層代價...

演算法導論 思考題 8 4

寫一下我的思路,大概是對的,詳細證明不出來。設藍色水壺為a,紅色為b 先取乙個a1,對所有的b做一次比較,可以將b分為兩個部分,一部分大於a1,一部分小於a1 再取乙個a2,將b分為三個部分 再取a3,將b分為四個部分 假設現在b被分成了k個部分,b1,b2,b3.bk,每次取ai,都從b集合的一半...