算法导论2.3练习答案
2.3-1使用圖2-4作為模型,說明歸并排序在數組A=<3,41,52,26,38,57,9,49>上的操作。
2.3-2重寫過程MERGE,使之不使用哨兵,而是一旦數組L或R的所有元素均被復制回A就立即停止,然后把另一個數組的剩余部分復制回A。
使用哨兵的歸并排序(MERGE-SORT)見文章:C語言實現歸并排序
無哨兵版:
2.3-3使用數學歸納法證明:當n剛好是2的冪時,以下遞歸式的解是T(n)=nlgn
T(n)={2,n=22T(n/2)+n,n=2k(k>1)T(n) = \begin{cases} 2 &\text{},n=2\\ 2T(n/2)+n &\text{},n=2^k(k>1) \end{cases} T(n)={22T(n/2)+n?,n=2,n=2k(k>1)?
(1). n = 21時,T(n) = 2 = 2lg2
(2). 假設 n = 2k時,T(n) = nlgn = 2klg2k = k2k
則對于 n = 2k+1,有
T(n) = 2T(2k+1 / 2) + 2k+1
= 2k?2k + 2k+1
= (k + 1)2k+1
= 2k+1lg2k+1
= nlgn
證畢。
2.3-4我們可以把插入排序表示為如下的一個遞歸過程。為了排序A[1…n],我們遞歸地排序A[1…n-1],然后把A[n]插入已排序的數組A[1…n-1]。為插入排序的這個遞歸版本的最壞情況運行時間寫一個遞歸式。
最壞情況下將A[n]插入到子序列A[1…n-1]需要花費Θ(n)時間。
T(n)={Θ(1),n=1T(n?1)+Θ(n),n>1T(n) = \begin{cases} \Theta(1) &\text{},n=1\\ T(n-1)+\Theta(n) &\text{},n>1 \end{cases} T(n)={Θ(1)T(n?1)+Θ(n)?,n=1,n>1?
時間復雜度為(n-1)Θ(n)+Θ(1)=Θ(n2)
2.3-5回顧查找問題(參見練習2.1-3),注意到如果序列A已排好序,就可以將該序列的中點與v進行比較。根據比較的結果,原序列中就有一半可以不用再做進一步的考慮了。二分查找算法會重復這個過程,每次都將序列剩余的部分規模減半。為二分查找寫出迭代或遞歸的偽代碼。證明:二分查找最壞情況運行時間為θ(lgn)。
偽代碼:
1.迭代版
2.遞歸版
RECURSIVE-BINART-SEARCH(A,v,low,high)if low>highreturn NILmid=(low+high)/2if v==A[mid]return midelse if v<A[mid]return RECURSIVE-BINART-SEARCH(A,v,low,mid-1)elsereturn RECURSIVE-BINART-SEARCH(A,v,mid+1,high)C語言代碼見文章:C語言實現二分查找,折半查找(迭代/遞歸)
遞歸式:
T(n)={Θ(1),n=1T(n/2)+Θ(1),n>1T(n) = \begin{cases} \Theta(1) &\text{},n=1\\ T(n/2)+\Theta(1) &\text{},n>1 \end{cases} T(n)={Θ(1)T(n/2)+Θ(1)?,n=1,n>1?
可自行使用遞歸樹進行分析,設遞歸樹的高度為h,則2h=n,共有(lgn + 1)個 Θ(1)。
所以最壞情況下 T(n) = (lgn + 1)Θ(1) = Θ(lgn)。
2.3-6注意到2.1節中的過程INSERTION-SORT的第5~7行的while循環采用一種線性查找來(反向)掃描已排好序的子數組A[1…j-1]。我們可以使用二分查找(參見練習2.3-5)來把插入排序的最壞情況總運行時間改進到θ(nlgn)嗎?
不可以
算法分析與代碼實現:二分查找插入排序(優化的直接插入排序)
最壞情況下需要對1 + 2 + 3 + … + (n - 1) = n(n - 1)/2個元素后移,需要的賦值操作次數為n(n - 1)/2 + (n - 1),排序的時間復雜度仍為O(n2)。
2.3-7描述一個運行時間為O(nlgn)的算法,給定n個整數的集合S和另一個整數x,該算法能確定S中是否存在兩個其和剛好為x的元素。
首先使用歸并排序對集合S進行排序,這一步的運行時間為O(nlgn),然后對S中任一元素 si 使用二分查找在子序列 S[i+1…n] 中檢索值為 x - si 的元素。這一步的運行時間為 O(lgn)。
綜上,該算法的運行時間為 O(nlgn) + n?O(lgn) = O(nlgn)
總結
以上是生活随笔為你收集整理的算法导论2.3练习答案的全部內容,希望文章能夠幫你解決所遇到的問題。