《算法导论》第三版第7章 快速排序 练习思考题 个人答案
7.1 快速排序的描述
7.1-1
解:
13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11
9, 19, 13, 5, 12, 8, 7, 4, 21, 2, 6, 11
9, 5, 13, 19, 12, 8, 7, 4, 21, 2, 6, 11
9, 5, 8, 19, 12, 13, 7, 4, 21, 2, 6, 11
9, 5, 8, 7, 12, 13, 19, 4, 21, 2, 6, 11
9, 5, 8, 7, 4, 13, 19, 12, 21, 2, 6, 11
9, 5, 8, 7, 4, 2, 19, 12, 21, 13, 6, 11
9, 5, 8, 7, 4, 2, 6, 12, 21, 13, 19, 11
9, 5, 8, 7, 4, 2, 6, 11, 21, 13, 19, 12
return 8
7.1-2
解:r;可以檢查所有元素的值都相同的情況
7.1-3
易證。
7.1-4
解:第四行的≤改為≥。
7.2 快速排序的性能
7.2-1
證明:
T(n)≥c1(n?1)2+cn=c1n2?2c1n+c1+cn≥c1n2T(n)\geq c_1(n-1)^2+cn=c_1n^2 - 2c_1n+c_1+cn\geq c_1n^2T(n)≥c1?(n?1)2+cn=c1?n2?2c1?n+c1?+cn≥c1?n2
(c?2c1)n+c1≥0(c-2c_1)n+c_1\geq 0(c?2c1?)n+c1?≥0
c1≤c2c_1 ≤ \frac{c}{2}c1?≤2c?
T(n)≤c2(n?1)2+cn=c2n2?2c2n+c2+cn≤c2n2T(n) ≤ c_2(n-1)^2 + cn = c_2n^2 - 2c_2n + c_2 + cn ≤ c_2n^2T(n)≤c2?(n?1)2+cn=c2?n2?2c2?n+c2?+cn≤c2?n2
(c?2c2)n+c2≤0(c - 2c_2)n + c_2\leq 0(c?2c2?)n+c2?≤0
c2≥c2c_2 ≥ \frac{c}{2}c2?≥2c?
……
7.2-2
解:Θ(n2)Θ(n^2)Θ(n2)
7.2-3
證明(翻譯自參考答案):所有元素降序排列時我們運行的是“最壞情況PARTITION”。它每一步只將要考慮的子數組大小減1,運行時間Θ(n2)Θ(n^2)Θ(n2)。
7.2-4
本題證明翻譯自https://ita.skanev.com/07/02/04.html
證明:
一個簡單直觀的論證就足夠了。
數組排序越多,插入排序的工作量就越少。即,INSERTION-SORT是Θ(n+d),其中d是陣列中的逆序對個數。 在上面的例子中,逆序對往往很少,因此插入排序將接近線性。
另一方面,如果PARTITION確實選擇了不在逆序對中的元素,它將產生一個空分區。由于存在逆序對很少,QUICKSORT很可能產生空分區。
7.2-5
證明:
(1)最小深度:
αmn=1
m=-logαn=-lgn/lgα
(2)最大深度:
(1-α)Mn=1
M=-lgn/lg(1-α)
7.2-6
證明:
設nln_lnl?和nr_rr?代表左右兩邊的比例,更均衡表示∣nl?nr∣<1?2α|n_l-n_r| < 1-2α∣nl??nr?∣<1?2α
當0<nl<α0<n_l<α0<nl?<α時,∣nl?nr∣>1?2α|n_l-n_r| > 1-2α∣nl??nr?∣>1?2α
當α<nl<1?αα<n_l<1-αα<nl?<1?α時,∣nl?nr∣<1?2α|n_l-n_r| < 1-2α∣nl??nr?∣<1?2α
當1?α<nl<11-α<n_l<11?α<nl?<1時,∣nl?nr∣>1?2α|n_l-n_r| > 1-2α∣nl??nr?∣>1?2α
而nln_lnl?是均勻分布的,所以p≈1?2αp≈1-2αp≈1?2α
7.3 快速排序的隨機化版本
7.3-1
隨機化算法遭遇最壞情況的概率很小。
7.3-2
解:Θ(n)Θ(n)Θ(n);Θ(n)Θ(n)Θ(n)。
7.4 快速排序分析
7.4-1
證明:
T(n)≥c[0+(n?1)2]+Θ(n)≥cn2T(n) ≥ c[0+(n-1)^2]+Θ(n) ≥ cn^2T(n)≥c[0+(n?1)2]+Θ(n)≥cn2
cn2?2cn+c+c′n≥cn<2cn^2-2cn+c+c'n ≥ cn<^2cn2?2cn+c+c′n≥cn<2
只要c′>2cc' > 2cc′>2c,……
7.4-2
證明思路:遞歸式為T(n)=2T(n/2)+Θ(n)T(n)=2T(n/2)+Θ(n)T(n)=2T(n/2)+Θ(n),然后用主定理即可。
7.4-3
證明:
f(q)=q2+(n?q?1)2=q2+(n?1)2?2(n?1)q+q2=2q2?2(n?1)q+(n?1)2f(q)=q^2+(n-q-1)^2=q^2+(n-1)^2-2(n-1)q+q^2=2q^2-2(n-1)q+(n-1)^2f(q)=q2+(n?q?1)2=q2+(n?1)2?2(n?1)q+q2=2q2?2(n?1)q+(n?1)2
f′(q)=4q?2(n?1)f'(q)=4q-2(n-1)f′(q)=4q?2(n?1)
令f′(q)=0令f'(q)=0令f′(q)=0
q=n?12q=\frac{n-1}{2}q=2n?1?
當q<n?12時,f′(q)<0;當n?12時,f′(q)>0當q<\frac{n-1}{2}時,f'(q)<0;當\frac{n-1}{2}時,f'(q)>0當q<2n?1?時,f′(q)<0;當2n?1?時,f′(q)>0
f(0)=(n?1)2=f(n?1),證畢。f(0)=(n-1)^2=f(n-1),證畢。f(0)=(n?1)2=f(n?1),證畢。
7.4-4
證明:
E[X]=∑i=1n?1∑j=i+1n[2j?i+1]E[X]=\sum_{i=1}^{n?1} ∑_{j=i+1}^{n}[\frac{2}{j?i+1}]E[X]=∑i=1n?1?∑j=i+1n?[j?i+12?]
=∑i=1n?1∑k=1n?i2k+1]= \sum_{i=1}^{n?1}\sum_{k=1}^{n?i}\frac{2}{k+1}]=∑i=1n?1?∑k=1n?i?k+12?]
≥∑i=1n?1∑k=1n?i22k]\geq\sum_{i=1}^{n?1} \sum_{k=1}^{n?i}\frac{2}{2k}]≥∑i=1n?1?∑k=1n?i?2k2?]
≥∑i=1n?1Ω(lgn)]\geq \sum_{i=1}^{n?1}\Omega(lgn)]≥∑i=1n?1?Ω(lgn)]
=Ω(nlgn)=\Omega(nlgn)=Ω(nlgn)
7.4-5
cqnlg?n≥cink+cqnlg?(n/k)cqlg?n≥cik+cqlg?n?cqlg?klg?k≥cicqkc_qn\lg{n} \ge c_ink + c_qn\lg(n/k) \\ c_q\lg{n} \ge c_ik + c_q\lg{n} - c_q\lg{k} \\ \lg{k} \ge \frac{c_i}{c_q}kcq?nlgn≥ci?nk+cq?nlg(n/k)cq?lgn≥ci?k+cq?lgn?cq?lgklgk≥cq?ci??k
在理論中可以按上述過程確定k,而在實踐中可以試出k。
7.4-6
解:假設0<α≤1/20 < \alpha \le 1/20<α≤1/2
P=6α2?4α3=2α2(3?2α)P = 6\alpha^2 - 4\alpha^3 = 2\alpha^2(3 - 2\alpha)P=6α2?4α3=2α2(3?2α)
思考題
7-1 (Hoare劃分的正確性)
a.
解:
13(i), 19, 9, 5, 12, 8, 7, 4, 11, 2, 6(j), 21
6, 19(i), 9, 5, 12, 8, 7, 4, 11, 2(j), 13, 21
6, 2, 9, 5, 12, 8, 7, 4, 11(j), 19(i), 13, 21
b.
證明思路:該過程的初始化和循環條件將i和j控制在數組下標p和r的范圍內。
c.
同b。
d.
證明:
循環不變式:在比較i和j的條件之前,所有元素A[p…i-1]≤x和A[j+1…r]≥x。
初始化:這兩個重復塊就是這種情況。
保持:通過交換A[i]和A[j],我們得到A[p…i]≤x和A[j…r]≥x。遞增i和遞減j保持這個不變量。
終止:當i≥j時,循環終止。不變量仍然在終止時保持。
e.
解:
HOARE-QUICESORT(A, p, r) if p< rq = HOARE-PARTITION(A, p, r)HOARE-QUICKSORT(A, p, q-1)HOARE-QUICKSORT(A, q+1, r)7-2 (針對相同元素值的快速排序)
a.
解:Θ(n2)Θ(n^2)Θ(n2)
b.
解:
PARTITION'(A, p, r) t = PARTITION(A, p, r) q = t for j = t-1 downto pif A[j] == A[t]q = q - 1exchange A[j] with A[q] return q, tc.
解:
RANDOMIZED-PARTITION'(A, p, r) i = RANDOM(p, r) exchange A[i] with A[r] return PARTITION'(A, p, r) RANDOMIZED-QUICKSORT'(A, p, r) if p < rq, t = RANDOMIZED-PARTITION'(A, p, r)RANDOMIZED-QUICKSORT'(A, p, q-1)RANDOMIZED-QUICKSORT'(A, t+1, r)d.
思路:將zij定義為數組A中第i小的元素中的一個。
7-3 (另一種快速排序的分析方法)
a.
解:E[Xi] = 1/n
b.
證明:讓第q小元素成為主元。有n種可能的選擇,每種都有Xq的概率。每個都將通過在q-1和n-q兩個部分中分塊并添加線性因子來解決問題。
c.
證明:
E[T(n)]=E[∑q=1nXqT(q?1)+T(n?q)+Θ(n)]E[T(n)] = E[\sum_{q=1}^{n} X_qT(q-1)+T(n-q)+\Theta(n)]E[T(n)]=E[∑q=1n?Xq?T(q?1)+T(n?q)+Θ(n)]
=∑q?1nE(Xq)E[T(q?1)+T(n?q)+Θ(n)]=\sum_{q-1}^{n}E(X_q)E[T(q-1)+T(n-q)+\Theta(n)]=∑q?1n?E(Xq?)E[T(q?1)+T(n?q)+Θ(n)]
=1n∑q=1nE[T(q?1)+T(n?q)]+Θ(n)=\frac {1}{n} \sum_{q=1}^{n}E[T(q-1)+T(n-q)]+\Theta(n)=n1?∑q=1n?E[T(q?1)+T(n?q)]+Θ(n)
=2n∑q=2n?1E[T(q)]+Θ(n)=\frac {2}{n} \sum_{q=2}^{n-1}E[T(q)]+\Theta(n)=n2?∑q=2n?1?E[T(q)]+Θ(n)
d.
證明:
∑k=2n?1klgk=∑k=2?n2??1klgk+∑k=?n2?n?1klgk\sum_{k=2}^{n-1}klgk=\sum_{k=2}^{\lceil\frac {n}{2}\rceil-1}klgk+\sum_{k=\lceil\frac {n}{2}\rceil}^{n-1}klgk∑k=2n?1?klgk=∑k=2?2n???1?klgk+∑k=?2n??n?1?klgk
≤∑k=1n2klgn2+∑k=n2n?1klgn\leq\sum_{k=1}^{\frac {n}{2}}klg\frac{n}{2}+\sum_{k=\frac {n}{2}}^{n-1}klgn≤∑k=12n??klg2n?+∑k=2n?n?1?klgn
=lgn2?n2+2n8+lgn?3n2?2n8=lg\frac{n}{2}\cdot\frac{n^2+2n}{8}+lgn\cdot\frac{3n^2-2n}{8}=lg2n??8n2+2n?+lgn?83n2?2n?
=n28lgn2+3n28lgn+n4lgn2?n4lgn=\frac{n^2}{8}lg\frac{n}{2}+\frac{3n^2}{8}lgn+\frac{n}{4}lg\frac{n}{2}-\frac{n}{4}lgn=8n2?lg2n?+83n2?lgn+4n?lg2n??4n?lgn
≤n28lgn?n28lg2+3n28lgn=n22lgn?n28\leq\frac{n^2}{8}lgn-\frac{n^2}{8}lg2+\frac{3n^2}{8}lgn=\frac{n^2}{2}lgn-\frac{n^2}{8}≤8n2?lgn?8n2?lg2+83n2?lgn=2n2?lgn?8n2?
e.
證明:
E[T(n)]=2n∑q=2n?1E[T(q)]+Θ(n)E[T(n)]=\frac{2}{n}\sum_{q=2}^{n-1}E[T(q)]+\Theta(n)E[T(n)]=n2?∑q=2n?1?E[T(q)]+Θ(n)
≤2n∑q=2n?1aq?lgq+Θ(n)\leq\frac{2}{n}\sum_{q=2}^{n-1}aq\cdot lgq+\Theta(n)≤n2?∑q=2n?1?aq?lgq+Θ(n)
≤2an(n22lgn?n28)+Θ(n)\leq\frac{2a}{n}(\frac{n^2}{2}lgn-\frac{n^2}{8})+\Theta(n)≤n2a?(2n2?lgn?8n2?)+Θ(n)
≤anlgn?an4+Θ(n)\leq anlgn-\frac{an}{4}+\Theta(n)≤anlgn?4an?+Θ(n)
≤anlgn\leq anlgn≤anlgn
7-4 (快速排序的棧深度)
a.
證明:由兩次遞歸調用改為一次遞歸調用加一次循環遞歸調用,而那一次循環遞歸調用其實就是原本的第二次遞歸調用(參數相同,只是函數名不一樣了)。
b.
解:按升序排列輸入,需調用n次。
c.
解:
TAIL-RECURSIVE-QUICKSORT(A, p, r) while p < rq = PARTITION(A, p, r)if q <= (p + r) / 2TAIL-RECURSIVE-QUICKSORT(A, p, q-1)p = q + 1elseTAIL-RECURSIVE-QUICKSORT(A, q+1, r)r = q - 17-5 (三數取中劃分)
a.
解:pi=A33(i?1)(n?i)n(n?1)(n?2)=6(i?1)(n?i)n(n?1)(n?2)p_i=\frac{A_3^3(i-1)(n-i)}{n(n-1)(n-2)}=\frac{6(i-1)(n-i)}{n(n-1)(n-2)}pi?=n(n?1)(n?2)A33?(i?1)(n?i)?=n(n?1)(n?2)6(i?1)(n?i)?
b.
解:px1n=6(n2?1)(n?n2)n(n?1)(n?2)=3n(n?2)2(n?1)(n?2)=3n2(n?1)\frac{p_x}{\frac{1}{n}}=\frac{6(\frac{n}{2}-1)(n-\frac{n}{2})}{n(n-1)(n-2)}=\frac{3n(n-2)}{2(n-1)(n-2)}=\frac{3n}{2(n-1)}n1?px??=n(n?1)(n?2)6(2n??1)(n?2n?)?=2(n?1)(n?2)3n(n?2)?=2(n?1)3n?
limn→∞px1n=32lim_{n\rightarrow{\infty}}\frac{p_x}{\frac{1}{n}}=\frac{3}{2}limn→∞?n1?px??=23?
增加了12\frac{1}{2}21?。
c.
解:
p′=∑i=n32n3pi=∫n32n36(i?1)(n?i)n(n?1)(n?2)di=13n27(n?2)→1327p'=\sum_{i=\frac{n}{3}}^{\frac{2n}{3}}p_i=\int_{\frac{n}{3}}^{\frac{2n}{3}}\frac{6(i-1)(n-i)}{n(n-1)(n-2)}di=\frac{13n}{27(n-2)}\rightarrow\frac{13}{27}p′=∑i=3n?32n??pi?=∫3n?32n??n(n?1)(n?2)6(i?1)(n?i)?di=27(n?2)13n?→2713?
d.
證明思路:最好情況仍是Ω(nlgn)\Omega(nlgn)Ω(nlgn)。
7-6 (對區間的模糊排序)
思路:本題是對區間的模糊排序,可以理解為對于兩個區間有三種不同的狀態:1)區間1的右端在區間2的左端的左方,即區間1產生的元素必定小于區間2產生的元素;2)區間1的右端在區間2的左端的右方,且區間1的左端在區間2的右端的左方,即兩區間有重疊部分,產生的元素可能大于或等于或小于;3)區間1的左端在區間2的右端的右方,即區間1產生的元素必定大于區間2產生的元素。這三種情況分別對應非模糊排序的小于、等于、大于三種情況。
a.
解:
FUSSY-SORT(I[2]/*每個區間都由兩個值表示,所以是二維數組*/, p, r) if p < rq, t = RANDOM-PARTITION(I[2], p, r) // 這里借鑒了思考題7-2的思路FUSSY-SORT(I[2], p, q-1)p = t + 1 // 這里借鑒了思考題7-4的思路 RANDOM-PARTITION(I[2], p, r) key = RANDOM(p, r) exchange I[key][*] with I[r][*] a = I[r][1] b = I[r][2] i = p - 1 j = r + 1 for k = p to r-1if I[k][2] <= ai = i + 1exchange I[k][*] with I[i][*]else if I[k][1] >= bj = j - 1exchange I[k][*] with I[j][*]elsea = max(a, I[k][1])b = min(b, I[k][2]) return (i+1), (j-1)b.
證明思路:隨著重疊增加,一次分區后剩余需要排列的部分會減少,當所有區間都有重疊時,只需分區一次。
總結
以上是生活随笔為你收集整理的《算法导论》第三版第7章 快速排序 练习思考题 个人答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Highchart series一次只显
- 下一篇: SVN版本回滚