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