算法導論第二章
思考題
2-1
證明:
已知插入排序的最壞情況運行時間爲Θ ( n 2 ) Θ(n^{2}) Θ ( n 2 ) ,且我們使用插入排序來排序長度爲k k k 的n / k n/k n / k 個子表。
長度爲k k k 的一個子數組,用插入排序其最壞情況運行時間爲Θ ( k 2 ) Θ(k^{2}) Θ ( k 2 ) ,且有n / k n/k n / k 個子表,得出Θ ( n k × k 2 ) Θ(\dfrac{n}{k} \times k^{2}) Θ ( k n × k 2 ) ,結果爲Θ ( n k ) Θ(nk) Θ ( n k )
舉個例子:當一個總長度爲n n n 的輸入( n > 1 ) (n > 1) ( n > 1 ) ,經過一次歸併排序遞歸後,將n n n 一分爲二,也就是n / 2 n / 2 n / 2 ,如果k k k 爲代表的當前這次的長度n / 2 n / 2 n / 2 ,則我們可以得出層數:
l g ( n / k ) + 1 = = l o g 2 ( n / k ) + 1 = = l o g 2 ( n / n 2 ) + 1 = = l o g 2 ( 2 ) + 1 = = 2 lg(n/k)+1==log_{2}(n / k)+1==log_{2}(n / \dfrac{n}{2})+1==log_{2}(2)+1==2 l g ( n / k ) + 1 = = l o g 2 ( n / k ) + 1 = = l o g 2 ( n / 2 n ) + 1 = = l o g 2 ( 2 ) + 1 = = 2
得到層數爲2。
同理,當我們再一次經過歸併排序遞歸後,n / 2 n/2 n / 2 再次一分爲2 2 2 ,也就是( n / 2 ) / 2 = = n / 4 (n/2)/2==n/4 ( n / 2 ) / 2 = = n / 4 ,k k k 爲n / 4 n/4 n / 4 ,代入上面的式子,得出層數3。
我們可以得出,l g ( n / k ) + 1 lg(n/k)+1 l g ( n / k ) + 1 即爲歸併排序遞歸的層數,因爲合併算法MERGE的最壞情況運行時間爲Θ ( n ) Θ(n) Θ ( n ) ,得出n l g ( n / k ) + n nlg(n/k)+n n l g ( n / k ) + n ,去掉常量,得出Θ ( n l g ( n / k ) ) Θ(nlg(n/k)) Θ ( n l g ( n / k ) )
最大值是k = l g n k=lgn k = l g n ,如果我們替代,我們得到:
Θ ( n l g n + n l g n l g n ) = Θ ( n l g n ) Θ(nlgn+nlg\dfrac{n}{lgn})=Θ(nlgn) Θ ( n l g n + n l g l g n n ) = Θ ( n l g n )
如果k = f ( n ) > l g n k=f(n)>lgn k = f ( n ) > l g n ,複雜性將是Θ ( n f ( n ) ) Θ(nf(n)) Θ ( n f ( n ) ) ,它比合並排序的運行時間大
It’s constant factors, so we just figure out when insertion sort beats merge
sort, exactly as we did in exercise 1.2.2, and pick that number for k.
(這是常數因子,所以我們只找出插入排序比合並排序,完全像我們在練習 1.2.2 1.2.2 1 . 2 . 2 中所做的那樣,並選擇該數字K K 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 ]
We need to prove that A’ consists of the original elements in A, although in (possibly) different order.
(我們需要證明A’由A中的原始元素組成,儘管順序可能不同。)
循環不變式( 2 (2 ( 2 ~4 ) 4) 4 ) :
(1)總是從最後一個元素開始遞減,且後前一位元素進行判斷交換
(2)每循環一次後,A [ j ] A[j] A [ j ] 是A [ j . . A . l e n g t h ] A[j..A.length] A [ j . . A . l e n g t h ] 中最小的元素
證明:
初始化:循環的第一次迭代i i i 爲首元素,j j j 爲尾元素,判斷式爲真,開始執行循環
保持:進行A [ j ] A[j] A [ j ] 和A [ j − 1 ] A[j - 1] A [ j − 1 ] 的判斷,如果A [ j ] > A [ j − 1 ] A[j] > A[j - 1] A [ j ] > A [ j − 1 ] 則交換換元素中的數據,我們可以得知,A [ j ] A[j] A [ j ] 將會是A [ j ] 和 A [ j − 1 ] A[j]和A[j-1] A [ j ] 和 A [ j − 1 ] 中最小的一個,同理,A [ j ] A[j] A [ j ] 也會是A [ j . . A . l e n g t h ] A[j..A.length] A [ j . . A . l e n g t h ] 中最小的。
終止:因爲每次循環後,A [ j ] A[j] A [ j ] 總是A [ j . . A . l e n g t h ] A[j..A.length] A [ j . . A . l e n g t h ] 中最小的,所以退出循環後,A [ i ] A[i] A [ i ] 將會是A [ i . . A . l e n g t h ] A[i..A.length] A [ i . . A . l e n g t h ] 中最小的數字
循環不變式( 1 (1 ( 1 ~4 ) 4) 4 ) :
(1)每次循一次後,A [ 1.. i ] 都 是 排 好 序 的 A[1..i]都是排好序的 A [ 1 . . i ] 都 是 排 好 序 的
證明:
初始化:循環的第一次迭代i i i 爲首元素,且循環至i i i 大於A . l e n g t h − 1 A.length-1 A . l e n g t h − 1 ,第一次判斷式爲真,開始執行循環
保持:已經證明了每當執行完次( 2 (2 ( 2 ~4 ) 4) 4 ) 循環時,A [ j ] A[j] A [ j ] 是A [ j . . A . l e n g t h ] A[j..A.length] A [ j . . A . l e n g t h ] 中最小的元素,得到當前循環每迭代循環一次,其A [ 1.. i ] A[1..i] A [ 1 . . i ] 將總是排序好的
終止:當i i i 大於A . l e n g t h − 1 A.length-1 A . l e n g t h − 1 終止,A [ 1.. i ] A[1..i] A [ 1 . . i ] 將是排序好的,也相當於說A [ 1.. A . l e n g t h − 1 ] A[1..A.length-1] A [ 1 . . A . l e n g t h − 1 ] 是排序好的,最後一個元素不用排序,因爲它一定是A中最大元素,也理應在最後一位
最壞情況運行時間爲Θ ( n 2 ) Θ(n^{2}) Θ ( n 2 )
BUBBLESORT ( A)
1 for i = 1 to A. length - 1 c1 n
2 for j = A. length downto i + 1 c2 ①
3 if A[ j] < A[ j - 1 ] c3 ②
4 exchange A[ j] with A[ j - 1 ] c4 ②
① ∑ j = 2 n t j \sum ^{n}_{j=2}t_{j} ∑ j = 2 n t j
② ∑ j = 2 n ( t j − 1 ) \sum ^{n}_{j=2}\left( t_{j}-1\right) ∑ j = 2 n ( t j − 1 )
該算法的運行時間(執行每條語句的運行時間之和)是:
T ( n ) = C 1 n + C 2 ∑ j = 2 n t j + C 3 ∑ j = 2 n ( t j − 1 ) + C 4 ∑ j = 2 n ( t j − 1 ) T\left( n\right) =C_{1}n+C_{2}\sum ^{n}_{j=2}t_{j}+C_{3}\sum ^{n}_{j=2}\left( t_{j}-1\right)+C_{4}\sum ^{n}_{j=2}\left( t_{j}-1\right) T ( n ) = C 1 n + C 2 ∑ j = 2 n t j + C 3 ∑ j = 2 n ( t j − 1 ) + C 4 ∑ j = 2 n ( t j − 1 )
其中我們注意到:
∑ j = 1 n t j \sum ^{n}_{j=1}t_{j} ∑ j = 1 n t j = ( n ( n + 1 ) 2 − 1 ) \left( \dfrac {n\left( n+1\right) }{2}-1\right) ( 2 n ( n + 1 ) − 1 )
∑ j = 2 n ( t j − 1 ) \sum ^{n}_{j=2}\left( t_{j}-1\right) ∑ j = 2 n ( t j − 1 ) = n ( n − 1 ) 2 \dfrac {n\left( n-1\right)}{2} 2 n ( n − 1 )
最壞情況運行時間
T ( n ) = C 1 n + C 2 ( n ( n + 1 ) 2 − 1 ) + C 3 ( n ( n − 1 ) 2 ) + C 4 ( n ( n − 1 ) 2 ) T\left( n\right) =C_{1}n+C_{2}\left( \dfrac {n\left( n+1\right) }{2}-1\right)+C_{3}\left( \dfrac {n\left( n-1\right)}{2}\right)+C_{4}\left( \dfrac {n\left( n-1\right)}{2}\right) T ( n ) = C 1 n + C 2 ( 2 n ( n + 1 ) − 1 ) + C 3 ( 2 n ( n − 1 ) ) + C 4 ( 2 n ( n − 1 ) )
= ( C 2 2 + C 3 2 + C 4 2 ) n 2 + ( C 1 + C 2 2 − C 3 2 − C 4 2 ) n − C 2 =\left( \dfrac {C_{2}}{2}+\dfrac {C_{3}}{2}+\dfrac {C_{4}}{2}\right) n^{2}+\left(C_{1}+\dfrac {C_{2}}{2}-\dfrac{C_{3}}{2}-\dfrac{C_{4}}{2}\right)n-C_{2} = ( 2 C 2 + 2 C 3 + 2 C 4 ) n 2 + ( C 1 + 2 C 2 − 2 C 3 − 2 C 4 ) n − C 2
我們可以表示爲:a n 2 + b n + c an^{2}+bn+c a n 2 + b n + c
忽略掉低階項和最重要的項的常係數時,只剩下重要的項中的因子n 2 n^{2} n 2 ,得出運行時間爲Θ ( n 2 ) Θ\left(n^{2}\right) Θ ( n 2 )
與插入算法相比,感覺半斤八兩吧
2-3
Θ ( n ) Θ(n) Θ ( n )
該算法的運行時間是Θ ( n ) Θ(n) Θ ( n ) ,與霍納規矩相比,霍納規矩的性能更好
Polynomial ( A, n)
1 if n == 0
2 return A[ A. length - n]
3 return A[ A. length - n] + x * Polynomial ( A, n - 1 )
算法導論第二章思考題2-3( ( ( 自己看) ) )
It should be fairly obvious, but the invariant of the loop is a sum that equals a polynomial with the given coefficients.
(這應該是很明顯的,但是循環不變式是一個等於給定係數的多項式的和。)
2-4
( 6 , 1 ) 、 ( 8 , 1 ) 、 ( 3 , 1 ) 、 ( 2 , 1 ) 、 ( 8 , 6 ) (6, 1)、(8, 1)、(3, 1)、(2, 1)、(8, 6) ( 6 , 1 ) 、 ( 8 , 1 ) 、 ( 3 , 1 ) 、 ( 2 , 1 ) 、 ( 8 , 6 )
一個遞減排好序得數組具有最多得逆序對,具有∑ j = 1 n − 1 t j \sum^{n-1}_{j=1}t_{j} ∑ j = 1 n − 1 t j ,也就是n ( n − 1 ) 2 \dfrac{n\left(n-1\right)}{2} 2 n ( n − 1 ) 個逆序對
算法導論第二章思考題2-4( ( ( 自己看) ) )
算法導論第二章思考題2-4( ( ( 自己看) ) )