《算法导论》第三版第9章 中位数和顺序统计量 练习&思考题 个人答案
9.1 最小值和最大值
9.1-1
解:
两两比较,直至找到最小值(共需n−1n-1n−1次),将曾与最小值比较过的值进行比较(共需⌈lgn⌉−1\lceil lgn\rceil -1⌈lgn⌉−1次)。
n−1+⌈lgn⌉−1=n+⌈lgn⌉−2n-1+\lceil lgn\rceil -1=n+\lceil lgn\rceil -2n−1+⌈lgn⌉−1=n+⌈lgn⌉−2
9.1-2
解:先两两比较一轮(比较次数⌊n2⌋\lfloor \frac{n}{2}\rfloor⌊2n⌋),将较大值分为一组(最多⌈n2⌉\lceil \frac{n}{2}\rceil⌈2n⌉个元素),较小值分为一组(最多⌈n2⌉\lceil \frac{n}{2}\rceil⌈2n⌉个元素),之后分别在两组间找出最大值(最小值)(比较次数2⌈n2⌉−22\lceil \frac{n}{2}\rceil-22⌈2n⌉−2),⌊n2⌋+2⌈n2⌉−2=⌈3n2⌉−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
9.2-4
[p]思路:依次选择9、8、7、6、5、4、3、2、1。9.3 最坏情况为线性时间的选择算法
9.3-1
解:
(1)T(n)≤{O(1), n<126T(⌈n7⌉)+T(5n7+8)+O(n), n≥126T(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的证明:
cn7+c+5cn7+8c+an≤cn\frac{cn}{7}+c+\frac{5cn}{7}+8c+an\leq cn7cn+c+75cn+8c+an≤cn
c≥7ann−63c \geq 7a\frac{n}{n-63}c≥7an−63n
取126的思路类似于第124页取数字140的思路。。。
(2)T(n)≤T(⌈n3⌉)+T(2n3+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)
时间复杂度是Ω(nlgn)\Omega(nlgn)Ω(nlgn)
9.3-2
证明:
310−6n≥36140>14\frac{3}{10}-\frac{6}{n}\geq \frac{36}{140} >\frac{1}{4}103−n6≥14036>41
9.3-3
思路:使用SELECT
解:
BEST-CASE-QUICKSORT(A, p, r) if p < r i = floor((r-p+1)/2) x = SELECT(A, p, r, i) q = PARTITION(x) BEST-CASE-QUICKSORT(A, p, q-1) BEST-SACE-QUICKSORT(A, q+1, r)
9.3-4
这题不太明白,好像翻译错了?
参考https://ita.skanev.com/09/03/04.html
9.3-5
解:
SELECT'(A, p, r, i) if p == r return A[p]递归式T(n)≤T(n2+O(n))T(n)\leq T(\frac{n}{2}+O(n))T(n)≤T(2n+O(n))x = MEDIAN(A, p, r) q = PARTITION(x) k = q - p + 1 if i == k return A[q] else if i < k return SELECT'(A, p, q-1, i) else return SELECT'(A, q+1, r, i-k)
T(n)=O(n)T(n)=O(n)T(n)=O(n)
9.3-6
思路:找出分位数中的中位数,将集合分为两个大小相近的部分,再进行分治。这题没有给出代码的原因“分成k个等大小集合”不太具体,分割后是包含这些分位数还是不包括呢。。。比如说把1,2,3,4,5分为三个部分,是2,4两个分位数吗?还是没法平均分呢?
9.3-7
思路:先找出中位数,再对每个元素与中位数作差取绝对值,找出前k小的绝对值,再依此找到原元素。
9.3-8
思路:
(如果X和Y的长度为1,就输出较小值)先分别找出X和Y的中位数进行比较(如果相等直接输出),中位数比较小的那一个数组削去前半截(保留⌊n2⌋\lfloor\frac{n}{2}\rfloor⌊2n⌋个),中位数比较大的那一个数组削去后半截(也保留⌊n2⌋\lfloor\frac{n}{2}\rfloor⌊2n⌋个),再重复这一操作。
9.3-9
解:
y取中位数(n为奇数)或上中位数与下中位数之间任意一值(n为偶数)。易证。
思考题
9-1 (有序序列中的i个最大数)
a.
解:O(nlgn)O(nlgn)O(nlgn)
b.
解:O(n+ilgn)O(n+ilgn)O(n+ilgn)
c.
解:O(n+ilgi)O(n+ilgi)O(n+ilgi)
9-2 (带权中位数)
a.
思路:权重相等时,重量取决于数量。
b.
解:
WEIGHTED-MEDIAN(A) SORT(A) // 选用一种O(nlgn)的排序算法就好 weight = 0 for i = 1 to A.length weight = weight + A[i].weight if weight >= 1/2 return A[i-1]
c.
解:求出中位数后进行权重的PARTITION,减去较小部分的重量后重复(注意后面就不一定是找中位数了,每一次PARTITION要计算要找到怎样的一个权重比)。
d.
证明思路:设f§是选在p点时的总距离,只要证明f(y)−f(x)≥0f(y)-f(x)\geq 0f(y)−f(x)≥0(x为加权中位数,y为非输入点)始终成立。
假设y>x(y<x时证明思路也一样),将y,x,xi的大小关系进行分类,可以分别证明f(y)−f(x)≥0f(y)-f(x)\geq 0f(y)−f(x)≥0。
e.
思路:看这意思就是要分别取x和y的带权中位数。证明和d类似,分别证明x的总距离和y的总距离最小即可。
9-3 (小顺序统计量)
a.
思路:提示给的很清楚。。
解:
if i >= n/2 SELECT else // 按照提示说的做
b.
证明思路:用代入法。
c.
代入b。
d.
代入b?
9-4 (随机选择的另一种分析方法)
a.
思路:只要i或j是在包含ijk的最小区间里第一个被选中的主元即可。
解:
E[Xijk]={2k−i+1, i<j≤k2j−i+1, i≤k≤j2j−k+1, k≤i<jE[X_{ijk}]=\begin{cases} \frac{2}{k-i+1}, & \ i<j\leq k \\ \frac{2}{j-i+1}, & \ i\leq k\leq j \\ \frac{2}{j-k+1}, & \ k\leq i<j \end{cases}E[Xijk]=⎩⎪⎨⎪⎧k−i+12,j−i+12,j−k+12, i<j≤k i≤k≤j k≤i<j
b.
本题证明来自https://ita.skanev.com/09/problems/04.html
E[Xk]=∑i=1n−1∑j=i+1n E[Xijk]E[X_k] = \sum_{i=1}^{n-1} \sum_{j=i+1}^n \ E[X_{ijk}]E[Xk]=∑i=1n−1∑j=i+1n E[Xijk]
=∑i=1k∑j=i+1nE[Xijk]+∑i=k+1n−1∑j=i+1nE[Xijk]= \sum_{i=1}^k\sum_{j=i+1}^n E[X_{ijk}]+ \sum_{i=k+1}^{n-1} \sum_{j=i+1}^n E[X_{ijk}]=∑i=1k∑j=i+1nE[Xijk]+∑i=k+1n−1∑j=i+1nE[Xijk]
=∑i=1k(∑j=i+1k−1E[Xijk]+∑j=knE[Xijk])+∑i=k+1n−1∑j=i+1nE[Xijk]= \sum_{i=1}^k \bigg(\sum_{j=i+1}^{k-1}E[X_{ijk}]+ \sum_{j=k}^nE[X_{ijk}] \bigg)+\sum_{i=k+1}^{n-1}\sum_{j=i+1}^nE[X_{ijk}]=∑i=1k(∑j=i+1k−1E[Xijk]+∑j=knE[Xijk])+∑i=k+1n−1∑j=i+1nE[Xijk]
=∑i=1k∑j=i+1k−1E[Xijk]+∑i=1k∑j=knE[Xijk]+∑i=k+1n−1∑j=i+1nE[Xijk]= \sum_{i=1}^k\sum_{j=i+1}^{k-1} E[X_{ijk}]+ \sum_{i=1}^k\sum_{j=k}^nE[X_{ijk}]+\sum_{i=k+1}^{n-1} \sum_{j=i+1}^nE[X_{ijk}]=∑i=1k∑j=i+1k−1E[Xijk]+∑i=1k∑j=knE[Xijk]+∑i=k+1n−1∑j=i+1nE[Xijk]
=∑i=1k−2∑j=i+1k−1E[Xijk]+∑i=1k∑j=knE[Xijk]+∑i=k+1n−1∑j=i+1nE[Xijk]= \sum_{i=1}^{k-2}\sum_{j=i+1}^{k-1} E[X_{ijk}]+ \sum_{i=1}^k\sum_{j=k}^nE[X_{ijk}]+ \sum_{i=k+1}^{n-1} \sum_{j=i+1}^n E[X_{ijk}]=∑i=1k−2∑j=i+1k−1E[Xijk]+∑i=1k∑j=knE[Xijk]+∑i=k+1n−1∑j=i+1nE[Xijk]
=∑i=1k−2∑j=i+1k−12k−i+1+∑i=1k∑j=kn2j−i+1+∑i=k+1n−1∑j=i+1n2j−k+1= \sum_{i=1}^{k-2}\sum_{j=i+1}^{k-1} \frac{2}{k - i + 1}+\sum_{i=1}^k\sum_{j=k}^n\frac{2}{j - i + 1}+ \sum_{i=k+1}^{n-1} \sum_{j=i+1}^n\frac{2}{j - k + 1}=∑i=1k−2∑j=i+1k−1k−i+12+∑i=1k∑j=knj−i+12+∑i=k+1n−1∑j=i+1nj−k+12
=2(∑i=1k∑j=kn1j−i+1+∑i=k+1n−1∑j=i+1n1j−k+1+∑i=1k−2∑j=i+1k−11k−i+1)= 2\bigg(\sum_{i=1}^k\sum_{j=k}^n\frac{1}{j - i + 1}+ \sum_{i=k+1}^{n-1} \sum_{j=i+1}^n\frac{1}{j - k + 1}+ \sum_{i=1}^{k-2} \sum_{j=i+1}^{k-1} \frac{1}{k - i + 1}\bigg)=2(∑i=1k∑j=knj−i+11+∑i=k+1n−1∑j=i+1nj−k+11+∑i=1k−2∑j=i+1k−1k−i+11)
=2(∑i=1k∑j=kn1j−i+1+∑i=k+1n−1∑j=i+1n1j−k+1+∑i=1k−2k−i−1k−i+1)= 2\bigg(\sum_{i=1}^k\sum_{j=k}^n\frac{1}{j - i + 1}+ \sum_{i=k+1}^{n-1} \sum_{j=i+1}^n\frac{1}{j - k + 1}+ \sum_{i=1}^{k-2}\frac{k - i - 1}{k - i + 1}\bigg)=2(∑i=1k∑j=knj−i+11+∑i=k+1n−1∑j=i+1nj−k+11+∑i=1k−2k−i+1k−i−1)
=2(∑i=1k∑j=kn1j−i+1+∑j=k+2n∑i=k+1j−11j−k+1+∑i=1k−2k−i−1k−i+1)= 2\bigg(\sum_{i=1}^k\sum_{j=k}^n\frac{1}{j - i + 1}+ \sum_{j=k+2}^n \sum_{i=k+1}^{j-1} \frac{1}{j - k + 1}+\sum_{i=1}^{k-2}\frac{k - i - 1}{k - i + 1}\bigg)=2(∑i=1k∑j=knj−i+11+∑j=k+2n∑i=k+1j−1j−k+11+∑i=1k−2k−i+1k−i−1)
=2(∑i=1k∑j=kn1j−i+1+∑j=k+2nj−k−1j−k+1+∑i=1k−2k−i−1k−i+1)= 2\bigg( \sum_{i=1}^k\sum_{j=k}^n\frac{1}{j - i + 1}+ \sum_{j=k+2}^n\frac{j - k - 1}{j - k + 1}+ \sum_{i=1}^{k-2} \frac{k - i - 1}{k - i + 1}\bigg)=2(∑i=1k∑j=knj−i+11+∑j=k+2nj−k+1j−k−1+∑i=1k−2k−i+1k−i−1)
≤2(∑i=1k∑j=kn1j−i+1+∑j=k+1nj−k−1j−k+1+∑i=1k−2k−i−1k−i+1)\le 2\bigg(\sum_{i=1}^k\sum_{j=k}^n\frac{1}{j - i + 1}+ \sum_{j=k+1}^n\frac{j - k - 1}{j - k + 1}+ \sum_{i=1}^{k-2} \frac{k - i - 1}{k - i + 1} \bigg)≤2(∑i=1k∑j=knj−i+11+∑j=k+1nj−k+1j−k−1+∑i=1k−2k−i+1k−i−1)
c.
∑j=k+1nj−k−1j−k+1+∑i=1k−2k−i−1k−i+1≤∑j=k+1n1+∑i=1k−21=n−k+k−2≤n\sum_{j=k+1}^n\frac{j-k-1}{j-k+1} + \sum_{i=1}^{k-2}\frac{k-i-1}{k-i+1}\le \sum_{j=k+1}^n 1 + \sum_{i=1}^{k-2}1 = n - k + k - 2 \le nj=k+1∑nj−k+1j−k−1+i=1∑k−2k−i+1k−i−1≤j=k+1∑n1+i=1∑k−21=n−k+k−2≤n
d.
易证。
- 《算法导论》第三版第11章 散列表 练习&思考题 个人答案
- 《算法导论》第三版第31章 数论算法 练习&思考题 个人答案
- 《算法导论》第9章 中位数和顺序统计量 个人笔记
- 算法导论:第9章 中位数和顺序统计量_1期望为线性时间的选择算法
- MATLAB程序设计教程(刘卫国·第三版)思考练习答案——第一章
- 算法导论第三版第二章思考题答案
- 算法导论 第9章 中位数和顺序统计量
- 算法导论:第9章 中位数和顺序统计量_2最坏情况为线性时间的选择算法
- 算法导论 第9章 中位数和顺序统计量 C++实现
- 算法导论第九章-中位数和顺序统计量
- 算法导论第三版 22.1 图的表示 练习题答案全解析
- 算法导论第三版思考题8-4
- 《算法导论》第三章-第1节_练习(参考答案)
- 算法导论(CLRS, 2nd) 个人答案 Ch12.1
- 算法导论(CLRS, 2nd) 个人答案 Ch6.1
- 算法导论中位数和顺序统计量之最大值最小值C#实现
- 算法导论 第九章 中位数和顺序统计量
- 《算法导论》第四章-第5节_练习(参考答案)
- 算法导论(第三版)练习 2.2-1 ~ 2.2-4
- 算法导论-中位数和顺序统计量