9.1 最小值和最大值
9.1-1
解:
两两比较,直至找到最小值(共需 n − 1 n-1 n−1次),将曾与最小值比较过的值进行比较(共需 ⌈ l g n ⌉ − 1 \lceil lgn\rceil -1 ⌈lgn⌉−1次)。
n − 1 + ⌈ l g n ⌉ − 1 = n + ⌈ l g n ⌉ − 2 n-1+\lceil lgn\rceil -1=n+\lceil lgn\rceil -2 n−1+⌈lgn⌉−1=n+⌈lgn⌉−2
9.1-2
解:先两两比较一轮(比较次数 ⌊ n 2 ⌋ \lfloor \frac{n}{2}\rfloor ⌊2n⌋),将较大值分为一组(最多 ⌈ n 2 ⌉ \lceil \frac{n}{2}\rceil ⌈2n⌉个元素),较小值分为一组(最多 ⌈ n 2 ⌉ \lceil \frac{n}{2}\rceil ⌈2n⌉个元素),之后分别在两组间找出最大值(最小值)(比较次数 2 ⌈ n 2 ⌉ − 2 2\lceil \frac{n}{2}\rceil-2 2⌈2n⌉−2), ⌊ n 2 ⌋ + 2 ⌈ n 2 ⌉ − 2 = ⌈ 3 n 2 ⌉ − 2 \lfloor \frac{n}{2}\rfloor+2\lceil \frac{n}{2}\rceil-2=\lceil \frac{3n}{2}\rceil-2 ⌊2n⌋+2⌈2n⌉−2=⌈23n⌉−2。
9.2 期望为线性时间的选择算法
9.2-1
易证。。
9.2-2
在一个分区中选取主元不会影响子问题的概率。也就是说,在RANDOMIZED-PARTITION中对RANDOM的调用产生一个结果,与下一次迭代中的调用无关。
9.2-3
RANDOMIZED-SELECT(A, p, r, i)
while p < r
q = RANDOMIZED-PARTITION(A, p, r)
k = q - p + 1
if i == k
return A[q]
else if i < k
r = q - 1
else p = q + 1
return A[p]
9.2-4
思路:依次选择9、8、7、6、5、4、3、2、1。
9.3 最坏情况为线性时间的选择算法
9.3-1
解:
(1) T ( n ) ≤ { O ( 1 ) , n < 126 T ( ⌈ n 7 ⌉ ) + T ( 5 n 7 + 8 ) + O ( n ) , n ≥ 126 T(n)\leq \begin{cases} O(1), & \ n<126 \\ T(\lceil\frac{n}{7}\rceil)+T(\frac{5n}{7}+8) +O(n), & \ n\geq 126\end{cases} T(n)≤{
O(1),T(⌈7n⌉)+T(75n+8)+O(n), n<126 n≥126
关于数字126的证明:
c n 7 + c + 5 c n 7 + 8 c + a n ≤ c n \frac{cn}{7}+c+\frac{5cn}{7}+8c+an\leq cn 7cn+c+75cn+8c+an≤cn
c ≥ 7 a n n − 63 c \geq 7a\frac{n}{n-63} c≥7an−63n
取126的思路类似于第124页取数字140的思路。。。
(2) T ( n ) ≤ T ( ⌈ n 3 ⌉ ) + T ( 2 n 3 + 4 ) + O ( n ) T(n)\leq T(\lceil\frac{n}{3}\rceil)+T(\frac{2n}{3}+4) +O(n) T(n)≤T(⌈3n⌉)+T(32n+4)+O(n)
时间复杂度是 Ω ( n l g n ) \Omega(nlgn) Ω(nlgn)
9.3-2
证明:
3 10 − 6 n ≥ 36 140 > 1 4 \frac{3}{10}-\frac{6}{n}\geq \frac{36}{140} >\frac{1}{4} 103−n6≥14036>4