算法导论 7.4 Exercises 答案

7.4-1

假设 T(n)cn2。那么有

T(n)=maxq=0n1{T(q)+T(nq1)}+Θ(n)maxq=0n1{c(q2+(nq1)2)}+Θ(n)=cmaxq=0n1{q2+(nq1)2}+Θ(n)

可以发现,当 q=0 q=n1 时,max 中包含的内容将达到最大,因此有

T(n)cmaxq=0n1{q2+(nq1)2}+Θ(n)=c(n1)2+Θ(n)=cn22cn+c+Θ(n)cn22cn+Θ(n)=cn2(2cnΘ(n))cn2(A)

其中步骤 (A) 假设了 2cn 渐进上界比 Θ(n) 大。

c=min(1,T(1)),n0=1。由于 T(1)ccn2,那么由数学归纳法,结论 T(n)=Ω(n2) 成立。

7.4-2

可以知道,最好运行时间 T(n) 的递推式满足 T(n)=minq=0n1{T(q)+T(nq1)}+Θ(n)。假设 T(n)cnlgn,那么有

T(n)=minq=0n1{T(q)+T(nq1)}+Θ(n)minq=0n1{cqlgq+c(nq1)lg(nq1)}+Θ(n)=cminq=0n1{qlgq+(nq1)lg(nq1)}+Θ(n)

将最后一行 max 中的内容对 2 取指数,得到 2qlgq+(nq1)lg(nq1)=q(nq1)2n1。可以发现,当 q=n12 时,这个式子才能取到最小值。不过为了方便证明,如果 T(n) 大于等于其中的非最小值,那么 T(n) 一定大于等于其中的最小值,因此令 q=n2,有:

T(n)cminq=0n1{qlgq+(nq1)lg(nq1)}+Θ(n)c(n/2lg(n/2)+(n/21)lg(n/21))+Θ(n)c(n/2lg(n/2)+(n/21)(lg(n/2)1))+Θ(n)(A)=cnlgnclgn+2c3c2n+Θ(n)=cnlgn(3cn2+clgn2cΘ(n))cnlgn(B)

其中,步骤 (A) 使用了假设 x2lg(x1)lgx1,即 n4,步骤 (B) 假设了 3cn2+clgn2c 的渐进增长要高于 Θ(n)(只要 c 大到恰到好处)。

因此,只需要假设 n4,并且 c 取值足够大。那么由数学归纳法,结论 T(n)=Ω(nlgn) 成立。

7.4-3

f(q)=q2+(nq1)2,那么 f(q)=4q2n+2,f(q)=4。当 f(q)=0 时,q=n12。因此 f(q) 在区间 [0,n12] 上递减,在 [n12,n1] 上递增。因此 f 0 或者是 n1 上取到最大值。

7.4-4

类似的,假设随机变量 X 是算法 RANDOMIZED-QUICKSORT 所进行的比较次数,那么按照书上的结论,有:

E[X]=i=1n1j=i+1n2ji+1=i=1n1k=1ni2k+1i=1n1k=1ni22k(A)=i=1n1Ω(lgn)=Ω(nlgn)

其中,步骤 (A) 是因为当 k1 时,1k+112k 成立。

因此,整个算法的期望运行时间为 Ω(nlgn)

7.4-5

按照递归树的思想,如果数组长度小于等于 k 时停止递归,那么整个递归树的高度为 lg(n/k),并且每一层所调用的划分算法的运行时间之和为 O(n)。因此,快速排序部分的运行时间为 lg(n/k)O(n)=O(nlg(n/k))

nk 时,算法终止递归,由于子问题不重叠,因此划分出的叶节点大约有 nk 个。根据插入排序算法的时间复杂度 O(n2)。因此,插入排序部分的时间为 nkO(k2)=O(nk)

因此,总共的时间复杂度之和为 O(nk+nlg(n/k))

如果不考虑不同算法之间的常数步骤耗费时间,那么令 f(k)=nk+nlg(n/k)

那么有 f(k)=nnkln2,f(k)=nk2ln2。当 f(k)=0 时,有 k=1ln2。此时 f(k) k=1ln2 处取到最小值。因此 k=1ln2

如果考虑不同算法之间的常数步骤耗费时间,那么 k 需要通过实验来分析取得。

7.4-6

不失一般性,假设 α12,因为当 β=1α 时,划分情况一致。

假设这个数组的 n 个元素都不相同,随机选取 3 个数,那么有 (n3) 种选法。其中,第 i 小的数成为最终的支点的支点的选法有 (i1)(ni) 种,因为比 i 小的数有 i1 种选法,比 i 大的数有 ni 种选法。令 p(n,i)=6(i1)(ni)n(n1)(n2) 表示第 i 小的元素最终成为支点的概率。

划分的元素是第 i 小时,只有当 j 满足 ijn+1i 时,以 j 划分才不会更坏,这样的 j 的概率占比之和为:

g(n,i)=j=in+1ip(n,j)=(22i+n)(2i2+n(n5)+2i(2+n))n(n1)(n2)

考虑去除 g(n,i) 分子分母中的所有非三次项(即低阶项),得到 h(n,i),并令 α=in 回代到 h(n,i) 中,得到 p(α)=(12α)(1+2α2α2)