算法导论第三版习题及答案
算法導論(第3版)習題答案
- 寫在前面
- 第 1 章
- 1.1-1
- 1.1-2
- 1.1-3
- 1.1-4
- 1.1-5
- 1.2-1
- 1.2-2
- 1.2-3
- 思考題 1-1
- 第 2 章
- 2.1-1
- 2.1-2
- 2.1-3
- 2.1-4
- 2.2-1
- 2.2-2
- 2.2-3
- 2.2-4
- 2.3-1
- 2.3-2
- 2.3-3
- 2.3-4
- 2.3-5
- 2.3-6
- 2.3-7
- 思考題2-1
- 2-2
- 2-3
- 2-4
- 第 3 章
- 3.1-1
- 3.1-2
- 3.1-3
- 3.1-4
- 3.1-5
- 3.1-6
- 3.1-7
- 3.1-8
- 3.2-1
- 3.2-2
- 3.2-3
- 3.2-4
- 3.2-5
- 3.2-6
- 3.2-7
- 3.2-8
- 思考題3-1
- 3-2
- 3-3
- 3-4
- 3-5
- 3-6
- 第4章
- 4.1-1
寫在前面
一邊看算法導論一邊做題,把自己的答案記錄下來一起交流,有不對之處歡迎指正。
仍在錄入中
第 1 章
1.1-1
給出現實生活中需要排序的一個例子或者現實生活中需要計算凸包的一個例子。
按字典序排列列表,或按姓名首字母排序人名。
1.1-2
除速度外,在真實環境中還可能使用哪些其他有關效率的量度。
比如內存占用率、資源利用率等。
1.1-3
選擇一種你以前已知的數據結構,并討論其優勢和局限。
以數組為例:
優點是 隨機訪問效率高,查找速度快
缺點是 插入及刪除效率較低,必須連續內存空間,不能動態擴展
1.1-4
前面給出的最短路徑與旅行商問題有哪些相似之處?又有哪些不同?
相似之處在于都是在圖中找到一條路徑。
不同之處在于最短路徑只關心兩地之間的路徑,而旅行商問題得到返回第一個點的許多路徑。
1.1-5
提供一個現實生活的問題,其中只有最佳解才行。然后提供一個問題,其中近似最佳的一個解也足夠好。
還以姓名首字母排序為例,只有一種排列結果,同時也是最佳解。
以背包問題為例,使用貪心算法可得到一個足夠好的解。
1.2-1
給出在應用層需要算法內容的應用的一個例子,并討論涉及的算法的功能。
百度搜索一個詞條的結果,其中涉及到多種算法,比如數據庫的查找、結果的排序以及各種推薦的算法。
1.2-2
假設我們正比較插入排序與歸并排序在相同機器上的實現。對規模為 nnn 的輸入,插入排序運行 8n28n^{2}8n2 步,而歸并排序運行 64nlgn64nlgn64nlgn 步。問對哪些 nnn 值,插入排序優于歸并排序?
對兩個函數比較可得,當規模2<=n<=432<=n<=432<=n<=43時,插入排序優于歸并排序。
1.2-3
nnn的最小值為何值時,運行時間為 100n2100n^{2}100n2 的一個算法在相同機器上快于運行時間為 2n2^{n}2n 的另一個算法?
最小值為15的時候。
思考題 1-1
略
第 2 章
2.1-1
以圖2-2為模型,說明INSERTION-SORT在數組 A={31,41,59,26,41,58}A=\{31, 41, 59, 26, 41, 58\}A={31,41,59,26,41,58} 上的執行過程。
略
2.1-2
重寫過程INSERTION-SORT,使之按非升序(而不是非降序)排序。
for j = 2 to A.lengthkey = A[j]i = j - 1while i > 0 and A[i] < keyA[i + 1] = A[i]i = i - 1A[i + 1] = key2.1-3
略
2.1-4
ADD-BINARY(A, B):C = new int[A.length + 1]local carry = 0for i = 1 to A.lengthC[i] = (A[i] + B[i] + carry) % 2carry = (A[i] + B[i] + carry) / 2C[i] = carryreturn C2.2-1
用 Θ\ThetaΘ 記號表示函數 n3/1000?100n2?100n+3n^{3}/1000-100n^{2}-100n+3n3/1000?100n2?100n+3 。
Θ(n3)\Theta(n^{3})Θ(n3)
2.2-2
略
2.2-3
平均情況下會檢查一半左右的元素,最壞情況下會檢查所有元素,所以時間分別為 n/2n / 2n/2 和 nnn ,都是 Θ(n)\Theta(n)Θ(n)
2.2-4
應如何修改任何一個算法,才能使之具有良好的最好情況運行時間?
通過對子問題使用更高效的處理方法。
2.3-1
使用圖2-4作為模型,說明歸并排序在數組 A={3,41,52,26,38,57,9,49}A=\{3, 41, 52, 26,38,57,9,49\}A={3,41,52,26,38,57,9,49} 上的操作
暫略
2.3-2
2.3-3
首先當 n=2=21n=2=2^{1}n=2=21 時,T(n)=T(2)=2=2lg2=nlgnT(n) =T(2)=2=2lg2=nlgnT(n)=T(2)=2=2lg2=nlgn 成立,對任意 n=2k(k>1)n=2^{k}(k>1)n=2k(k>1) ,如果有 T(n)=nlgnT(n)=nlgnT(n)=nlgn ,那么 T(2n)=2T(n)+2n=2nlgn+2n=2n(lgn+1)=2nlg(2n)T(2n)=2T(n)+2n=2nlgn+2n=2n(lgn+1)=2nlg(2n)T(2n)=2T(n)+2n=2nlgn+2n=2n(lgn+1)=2nlg(2n) ,推論依然成立,所以當nnn剛好是2的冪時,遞歸式的解是T(n)=nlgnT(n)=nlgnT(n)=nlgn 。
2.3-4
T(n)={Θ(1)若n=1T(n?1)+cn其他.T(n)=\begin{cases}\Theta(1)&若n=1\\T(n-1)+cn&其他\end{cases}.T(n)={Θ(1)T(n?1)+cn?若n=1其他?.
cncncn 是在已經排序的數組中插入的時間。
2.3-5
偽代碼如下:
BINARY-SEARCH(A, x):low = 1high = A.lengthwhile low <= high domid = (low + high) / 2if A[mid] == x thenreturn midelseif A[mid] < x thenlow = mid +1elsehigh = mid - 1很容易得出遞歸式為 T(n+1)=T(n/2)+cT(n +1) = T(n / 2) + cT(n+1)=T(n/2)+c ,易證運行時間是 Θ(lgn)\Theta(lgn)Θ(lgn)
2.3-6
二分查找并不會將最壞情況下總時間改進到 Θ(nlgn)\Theta(nlgn)Θ(nlgn) ,雖然二分查找會減少比較的次數,但是仍然需要將數組元素進行后移,最壞情況下是線性過程。
2.3-7
偽代碼如下:
SUM-FIND(S, x)MERGE-SORT(S, 1, S.length)for i = 1 to S.length doif BINARY-SEARCH(S, x - S[i]) ~= nil thenreturn truereturn false思考題2-1
a. 由于插入排序最壞情況下的運行時間為 Θ(n2)\Theta(n^{2})Θ(n2) ,則長度為 kkk 時,運行時間可以表示為 T(k)=ak2+bk+cT(k)=ak^{2}+bk+cT(k)=ak2+bk+c ,n/kn/kn/k 個所用時間即為 T=n/k(ak2+bk+c)=ank+bn+cn/k=Θ(nk)T=n/k(ak^{2}+bk+c)=ank+bn+cn/k=\Theta(nk)T=n/k(ak2+bk+c)=ank+bn+cn/k=Θ(nk) ,命題得證。
b. 易知遞歸式為
T(a)={0若a=1T(a/2)+ak若a=2T(a)=\begin{cases}0&若a=1\\T(a/2)+ak&若a=2\end{cases}T(a)={0T(a/2)+ak?若a=1若a=2?, 經歸納可得T(a)=aklgaT(a)=aklgaT(a)=aklga ,將 n/kn/kn/k 代入可得,T(n/k)=nlg(n/k)T(n/k)=nlg(n/k)T(n/k)=nlg(n/k), 即 n/kn/kn/k為2的冪的情況下,合并的時間為 Θ(nlg(n/k))\Theta(nlg(n/k))Θ(nlg(n/k))
c.
2-2
a. 還需要證明 A′A'A′ 中的所有元素就是 AAA 中的各個元素。
2-3
a. 顯然,代碼段的運行時間是 Θ(n)\Theta(n)Θ(n)
b. 嵌套循環乘加即可,時間是 Θ(n2)\Theta(n^2)Θ(n2),所以會慢 。
2-4
a. 五個逆序對如下:
<2,1>,<3,1>,<8,6>,<8,1>,<6,1><2, 1>, <3, 1>, <8, 6>,<8, 1>,<6, 1><2,1>,<3,1>,<8,6>,<8,1>,<6,1>
b. 該數組的反向數組有最多的逆序對,為 n(n?1)/2n(n-1)/2n(n?1)/2 個
第 3 章
3.1-1
3.1-2
將左邊展開得到 (n+a)b=nb+...+ab(n+a)^b = n^b + ... + a^b(n+a)b=nb+...+ab ,關鍵項則為 nbn^bnb ,顯然命題得證。
3.1-3
大 OOO 表示法表達的是上界,至少說明的是下界。
3.1-4
成立,可以取出一個 222 當做常數項。
不成立,因為不存在一個數使得 2n?2n<=c2n2^n*2^n<=c2^n2n?2n<=c2n
3.1-5
3.1-6
3.1-7
3.1-8
3.2-1
3.2-2
alogbc=alogac/logab=(alogac)1/logab=clogbaa^{logbc} = a^{logac / logab} = (a^{logac}) ^{1 / logab} = c^{logba}alogbc=alogac/logab=(alogac)1/logab=clogba
3.2-3
3.2-4
3.2-5
后者更大,因為 lg?(lgn)=lg?n?1>lg(lg?n)lg^*(lgn) = lg^*n - 1 > lg(lg^*n)lg?(lgn)=lg?n?1>lg(lg?n)
3.2-6
3.2-7
簡單代入或對方程使用一元二次方程求根公式都易證。
3.2-8
思考題3-1
3-2
a. 是 是 否 否 否
b. 是 是 否 否 否
c. 否 否 否 否 否
d. 否 否 是 是 否
e. 是 否 是 否 是
f. 是 否 是 否 是
3-3
3-4
3-5
3-6
第4章
4.1-1
總結
以上是生活随笔為你收集整理的算法导论第三版习题及答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmeter测试TCP服务器/模拟发送T
- 下一篇: [技术分享]20171130_Kendo