CLRS 第一部分

练习

3.2-4

⌈lg⁡n⌉!=Ω((lg⁡ne)lg⁡n)\lceil\lg n\rceil! =\Omega((\frac{\lg n}{e})^{\lg n}),而若 ⌈lg⁡n⌉!\lceil\lg n\rceil! 多项式有界,则存在常数 CC 满足 ⌈lg⁡n⌉!=O(Clg⁡n)\lceil\lg n\rceil! =O(C^{\lg n}),相互矛盾。因此 ⌈lg⁡n⌉!\lceil\lg n\rceil! 多项式无界;

⌈lg⁡lg⁡n⌉!=O(⌈lg⁡lg⁡n⌉⌈lg⁡lg⁡n⌉)=O(2lg⁡⌈lg⁡lg⁡n⌉⋅⌈lg⁡lg⁡n⌉)\lceil \lg\lg n\rceil! =O(\lceil\lg\lg n \rceil^{\lceil\lg\lg n \rceil})=O(2^{\lg\lceil\lg\lg n \rceil\cdot\lceil\lg\lg n \rceil})。其中,lg⁡⌈lg⁡lg⁡n⌉<⌈lg⁡lg⁡n⌉=o(lg⁡n)\lg\lceil\lg\lg n \rceil<\lceil\lg\lg n \rceil=o(\sqrt{\lg n}),因此 ⌈lg⁡lg⁡n⌉!=2o(lg⁡n)\lceil \lg\lg n\rceil! =2^{o(\lg n)} 是多项式有界的。

3.2-5

lg⁡∗(lg⁡n)=(lg⁡∗n)−1>lg⁡(lg⁡∗n)\lg^*(\lg n)=(\lg^*n)-1>\lg(\lg^*n)。

4.2-2

4.2-3

令 N=2⌈lg⁡n⌉∈[n,2n)N=2^{\lceil\lg n\rceil}\in[n,2n)。通过补 0 将矩阵维数扩展到 NN,运行时间为 Θ(Nlg⁡7)=Θ(nlg⁡7)\Theta(N^{\lg 7})=\Theta(n^{\lg 7})。

4.2-5

基于矩阵分块乘法,

方法 运行时间递归式 渐进运行时间
用 132464 次乘法操作完成 68×6868\times 68 的矩阵相乘 T(n)=132464T(n/68)T(n)=132464T(n/68) Θ(nlog⁡68132464)\Theta(n^{\log_{68}132464})
用 143640 次乘法操作完成 70×7070\times 70 的矩阵相乘 T(n)=143640T(n/70)T(n)=143640T(n/70) Θ(nlog⁡70143640)\Theta(n^{\log_{70}143640})
用 155424 次乘法操作完成 72×7272\times 72 的矩阵相乘 T(n)=155424T(n/72)T(n)=155424T(n/72) Θ(nlog⁡72155424)\Theta(n^{\log_{72}155424})

4.2-7

4.5-5

令 f(n)=nlog⁡ba⋅(b+1)⌈log⁡b+1n⌉=Θ(nlog⁡ba+1)f(n)=n^{\log_b a}\cdot (b+1)^{\lceil\log_{b+1}n\rceil}=\Theta(n^{\log_b a+1})。对于任意 mm,令 t=⌈log⁡b+1m⌉t=\lceil\log_{b+1}m\rceil,总是存在 n=(b+1)t>mn=(b+1)^t>m,af(n/b)=nlog⁡ba+1=f(n)af(n/b)=n^{\log_b a+1}=f(n),即不存在 c<1c<1 使得 af(n/b)≤cf(n)af(n/b)\le cf(n)。

5.1-2

期望运行时间是 Θ(2⌈lg⁡(b−a+1)⌉b−a+1lg⁡(b−a+1))\Theta(\frac{2^{\lceil\lg(b-a+1)\rceil}}{b-a+1}\lg(b-a+1))。

5.1-3

期望运行时间是 Θ(1p(1−p))\Theta(\frac{1}{p(1-p)})。

5.2-2

记事件 AA 为恰有两人被聘用,Bi(i∈(1,n])B_i(i\in(1,n]) 为除了 1 以外只有 ii 被聘用。若 BiB_i 发生,则 ii 第一个应聘,且 2 到 i−1i-1 的所有人在 1 之后应聘,因此 Pr{Bi}=1n(i−1)\mathrm{Pr}\{B_i\}=\frac{1}{n(i-1)}。Pr{A}=∑i=2nPr{Bi}=1n∑i=1n−11i\mathrm{Pr}\{A\}=\sum_{i=2}^n\mathrm{Pr}\{B_i\}=\frac{1}{n}\sum_{i=1}^{n-1}\frac{1}{i}。

5.3-3

使用这种随机化方法,结果为某一特定排列的概率为 knn\frac{k}{n^n},其中 kk 为整数,若这种方法能产生一个均匀随机排列,knn=1n!\frac{k}{n^n}=\frac{1}{n!},即 kn!=nnkn! =n^n,而 n>2n>2 时,n!n! 不是 nnn^n 的因子,因此 n>2n>2 时这种方法不能产生均匀随机排列。

5.3-5

nn 个 1∼n31\sim n^3 的随机数互不相同的概率为 n3n3×n3−1n3×⋯×n3−n+1n3 \frac{n^3}{n^3}\times\frac{n^3-1}{n^3}\times\cdots\times\frac{n^3-n+1}{n^3} 对于 k∈[0,n)k\in[0,n), n3n3−k−n2−k−1n2−k=n3+n2k−k2n3(n2−k)>0 \frac{n^3}{n^3-k}-\frac{n^2-k-1}{n^2-k}=\frac{n^3+n^2k-k^2}{n^3(n^2-k)}>0 因此 n3n3×n3−1n3×⋯×n3−n+1n3>n2−1n2×n2−1n2−1×⋯×n2−nn2−n+1=1−1n \begin{aligned} &\frac{n^3}{n^3}\times\frac{n^3-1}{n^3}\times\cdots\times\frac{n^3-n+1}{n^3}\\ >&\frac{n^2-1}{n^2}\times\frac{n^2-1}{n^2-1}\times\cdots\times\frac{n^2-n}{n^2-n+1}\\ =&1-\frac{1}{n} \end{aligned}

5.3-6

把结果中优先级相同的元素抽取出来,递归地随机排列,再按顺序放回原处。

5.4-4

假设一年有 nn 天。记 kk 个人中存在三个人生日相同为事件 AkA_k,kk 个人中有 p(2p≤k)p(2p\le k) 对人生日相同,除此之外都两两不同为事件 BkpB_{kp}。 Pr{Bkp}=1p!×(k2)×(k−22)×⋯×(k−2p+22)×nn×n−1n×⋯×n−k+pn×1np=k!×n!p!×(k−2p)!×2p×nk×(n−k+p)!Pr{Ak}=1−∑i=02i≤kPr{Bki}=1−∑i=02i≤kk!×n!i!×(k−2i)!×2i×nk×(n−k+i)! \begin{aligned} \mathrm{Pr}\{B_{kp}\}&=\frac{1}{p!}\times\binom{k}{2}\times\binom{k-2}{2}\times\cdots\times\binom{k-2p+2}{2}\times\frac{n}{n}\times\frac{n-1}{n}\times\cdots\times\frac{n-k+p}{n}\times\frac{1}{n^p}\\ &=\frac{k!\times n!}{p!\times (k-2p)!\times 2^p\times n^k\times (n-k+p)!}\\ \mathrm{Pr}\{A_k\}&=1-\sum_{i=0}^{2i\le k}\mathrm{Pr}\{B_{ki}\}\\ &=1-\sum_{i=0}^{2i\le k}\frac{k!\times n!}{i!\times (k-2i)!\times 2^i\times n^k\times (n-k+i)!} \end{aligned} 带入 n=365n=365 和 Pr{Ak}≥0.99\mathrm{Pr}\{A_k\}\ge 0.99,kk 最小为 155155。

5.4-7

Ai,lg⁡n−2lg⁡lg⁡n=1/2lg⁡n−2lg⁡lg⁡n=lg⁡2nn A_{i,\lg n-2\lg\lg n}=1/2^{\lg n-2\lg\lg n}=\frac{\lg^2 n}{n} 将序列分为 ⌊nlg⁡n−2lg⁡lg⁡n⌋\lfloor\frac{n}{\lg n-2\lg\lg n}\rfloor 个不相交的组,每个组都不是长度为 lg⁡n−2lg⁡lg⁡n\lg n-2\lg\lg n 的特征序列的概率是 (1−lg⁡2nn)⌊nlg⁡n−2lg⁡lg⁡n⌋≤(1−lg⁡2nn)nlg⁡n−2lg⁡lg⁡n−1≤(1−lg⁡2nn)nlg⁡n≤(e−lg⁡2nn)nlg⁡n=1n \begin{aligned} &(1-\frac{\lg^2 n}{n})^{\lfloor\frac{n}{\lg n-2\lg\lg n}\rfloor}\\ \le&(1-\frac{\lg^2 n}{n})^{\frac{n}{\lg n-2\lg\lg n}-1}\\ \le&(1-\frac{\lg^2 n}{n})^{\frac{n}{\lg n}}\\ \le&(e^{-\frac{\lg^2 n}{n}})^{\frac{n}{\lg n}}=\frac{1}{n} \end{aligned} 因此不出现比 lg⁡n−2lg⁡lg⁡n\lg n-2\lg\lg n 更长的特征序列的概率小于 1n\frac{1}{n}。

思考题

2-4

  1. T(n)=Θ(n+inversion)T(n)=\Theta(n+inversion)。回顾插入排序,外层循环每执行一次,逆序对数减少 tjt_j,最终逆序对数减少为 0,因此 inversion=∑j=0n−1tjinversion=\sum_{j=0}^{n-1} t_j;

3-6

我们只讨论 n>cn>c 的情况。

  1. f2∗(n)=⌈lg⁡lg⁡n⌉f^*_2(n)=\lceil\lg\lg n\rceil;
  2. f2∗(n)=⌈log⁡3lg⁡n⌉f^*_2(n)=\lceil\log_3\lg n\rceil;
  3. 令 g(n)=lg⁡n−lg⁡lg⁡ng(n)=\lg n-\lg\lg n,有 f2∗(n)=g1∗(lg⁡n)f^*_2(n)=g^*_1(\lg n)。显然,g1∗(n)≥⌈n−1lg⁡n⌉g^*_1(n)\ge\lceil\frac{n-1}{\lg n}\rceil。

    令 t=g1∗(n)t=g^*_1(n),我们知道,tt 是满足 lg⁡g0(n)+lg⁡g1(n)+⋯+lg⁡gt−1(n)≥n−1\lg g^0(n)+\lg g^1(n)+\cdots+\lg g^{t-1}(n)\ge n-1 的最小整数。函数 x/g(x)x/g(x) 在 (e,+∞)(e,+\infty) 上单调递增,且 gt−1(n)>eg^{t-1}(n)>e,因此对于 i∈[0,t−3]∩Zi\in[0,t-3]\cap\mathbb{Z},lg⁡gi(n)−lg⁡gi+1(n)<lg⁡gi+1(n)−lg⁡gi+2(n)\lg g^i(n)-\lg g^{i+1}(n)<\lg g^{i+1}(n)-\lg g^{i+2}(n),即 lg⁡gi(n)>t−i−1t−1lg⁡n\lg g^i(n)>\frac{t-i-1}{t-1}\lg n。若 t≥2n−1lg⁡nt\ge 2\frac{n-1}{\lg n},则 lg⁡g0(n)+lg⁡g1(n)+⋯+lg⁡gt−2(n)>t2lg⁡n≥n−1\lg g^0(n)+\lg g^1(n)+\cdots+\lg g^{t-2}(n)>\frac{t}{2}\lg n\ge n-1,与 tt 是最小满足条件的整数矛盾,因此 t<⌊2n−1lg⁡n⌋t<\lfloor 2\frac{n-1}{\lg n}\rfloor。

    综上所述,f2∗(n)∈[⌈lg⁡n−1lg⁡lg⁡n⌉,⌊2lg⁡n−1lg⁡lg⁡n⌋)f^*_2(n)\in[\lceil\frac{\lg n-1}{\lg\lg n}\rceil,\lfloor 2\frac{\lg n-1}{\lg\lg n}\rfloor)。

4-4

  1. [zi]F(z)=Fi[zi](z+zF(z)+z2F(z))={1i=0F0i=1Fi−2+Fi−1i≥2=Fi \begin{aligned} &[z^i]F(z)=F_i\\ &\begin{aligned} [z^i](z+zF(z)+z^2F(z))&= \begin{cases} 1 & i=0\\ F_0 & i=1\\ F_{i-2}+F_{i-1} & i\ge 2 \end{cases}\\ &=F_i \end{aligned} \end{aligned}
  2. 由 a 可知,(1−z−z2)F(z)=z(1-z-z^2)F(z)=z,因此 F(z)=z1−z−z2=z(1−ϕz)(1−ϕ^z)=15(11−ϕz−11−ϕ^z) F(z)=\frac{z}{1-z-z^2}=\frac{z}{(1-\phi z)(1-\hat{\phi}z)}=\frac{1}{\sqrt{5}}(\frac{1}{1-\phi z}-\frac{1}{1-\hat{\phi}}z)
  3. 11−ϕz=∑i=0+∞ϕizi11−ϕ^z=∑i=0+∞ϕ^izi \begin{aligned} \frac{1}{1-\phi z}&=\sum_{i=0}^{+\infty}\phi^iz^i\\ \frac{1}{1-\hat{\phi}z}&=\sum_{i=0}^{+\infty}\hat{\phi}^iz^i \end{aligned} 因此 F(z)=∑i=0+∞15(ϕi−ϕ^i)zi F(z)=\sum_{i=0}^{+\infty}\frac{1}{\sqrt{5}}(\phi^i-\hat{\phi}^i)z^i
  4. 由 c 可知,Fi=15(ϕi−ϕ^i)F_i=\frac{1}{\sqrt{5}}(\phi^i-\hat{\phi}^i),因为 FiF_i 是整数且 15ϕ^i<12\frac{1}{\sqrt{5}}\hat{\phi}^i<\frac{1}{2},所以 FiF_i 为 15ϕi\frac{1}{\sqrt{5}}\phi^i 舍入到最近的整数。

4-5

  1. 坏芯片选择一个所有坏芯片的子集,子集内部的芯片互相报告为好芯片,同时将子集外的芯片报告为坏芯片,这时从结果来看,这个子集内的坏芯片和好芯片是完全等价的;
    • 将 nn 个芯片分为 ⌊n2⌋\lfloor\frac{n}{2}\rfloor 对,若 nn 为奇数则有一个芯片 CC 不在任何一对里;
    • 对这 ⌊n2⌋\lfloor\frac{n}{2}\rfloor 对芯片依次检测,若两个芯片都报告对方是好的,则任意抛弃一个,否则将两个芯片都抛弃;
    • 若 nn 为奇数且除了 CC,存在其他芯片未被抛弃,则抛弃 CC。
    这一过程之后芯片数量减少到至多 ⌊n2⌋\lfloor\frac{n}{2}\rfloor 个,同时好芯片数量超过一半的性质依然存在。
  2. 最坏情况下的比较次数 T(n)={0n=1T(⌊n2⌋)+⌊n2⌋n≥2 T(n)=\begin{cases} 0 & n=1\\ T(\lfloor\frac{n}{2}\rfloor)+\lfloor\frac{n}{2}\rfloor & n\ge 2 \end{cases} 一方面,T(n)≥⌊n2⌋=Ω(n)T(n)\ge\lfloor\frac{n}{2}\rfloor=\Omega(n),另一方面,对 T(n)T(n) 使用数学归纳法,假设对于所有 m<nm<n 都有 T(m)≤mT(m)\le m 成立,T(n)≤⌊n2⌋+⌊n2⌋≤nT(n)\le \lfloor\frac{n}{2}\rfloor+\lfloor\frac{n}{2}\rfloor\le n,因此 T(n)=O(n)T(n)=O(n)。综上,T(n)=Θ(n)T(n)=\Theta(n)。

4-6

  1. 必要性是显然的,我们来讨论充分性。

    条件变形得到 A[i][j]−A[i][j+1]≤A[i+1][j]−A[i+1][j+1]A[i][j]-A[i][j+1]\le A[i+1][j]-A[i+1][j+1],由不等式的传递性,对于 k>ik>i,A[i][j]−A[i][j+1]≤A[k][j]−A[k][j+1]A[i][j]-A[i][j+1]\le A[k][j]-A[k][j+1]。再次变形得到 A[i][j]−A[k][j]≤A[i][j+1]−A[k][j+1]A[i][j]-A[k][j]\le A[i][j+1]-A[k][j+1],由不等式的传递性,对于 i<k,j<li<k,j<l,A[i][j]−A[k][j]≤A[i][l]−A[k][l]A[i][j]-A[k][j]\le A[i][l]-A[k][l],即 A[i][j]+A[k][l]≤A[k][j]+A[i][l]A[i][j]+A[k][l]\le A[k][j]+A[i][l];
  2. 记该 Monge 矩阵为 MM。因为 MM 是 Monge 矩阵,对于 j<kj<k,M[i][j]−M[i][k]≤M[i+1][j]−M[i+1][k]M[i][j]-M[i][k]\le M[i+1][j]-M[i+1][k]。假设存在 i∈[1,m)i\in[1,m),f(i)>f(i+1)f(i)>f(i+1),由于 M[i+1][f(i+1)]M[i+1][f(i+1)] 是第 i+1i+1 行的最左最小值,M[i+1][f(i+1)]−M[i+1][f(i)]≤0M[i+1][f(i+1)]-M[i+1][f(i)]\le 0,因此 M[i][f(i+1)]−M[i][f(i)]≤0M[i][f(i+1)]-M[i][f(i)]\le 0,与 M[i][f(i)]M[i][f(i)] 是第 ii 行的最左最小值矛盾,因此 f(1)≤f(2)≤⋯f(m)f(1)\le f(2)\le\cdots f(m);
  3. T(m,n)=T(⌊m2⌋,n)+Θ(m+n)=Θ(m+nlog⁡m)T(m,n)=T(\lfloor\frac{m}{2}\rfloor, n)+\Theta(m+n)=\Theta(m+n\log m)

5-1

  1. 记事件 AtxA_{tx} 为进行 INCREMENT\mathrm{INCREMENT} 操作 tt 次后 i=xi=x。 Pr{Atx}=(1−1nx+1−nx)Pr{At−1,x}+1nx−nx−1Pr{At−1,x−1}E[it]=∑x=1+∞Pr{Atx}×nx=∑x=1+∞((1−1nx+1−nx)×Pr{At−1,x}×nx+1nx−nx−1×Pr{At−1,x−1}×nx)=∑x=1+∞((1−1nx+1−nx)×Pr{At−1,x}×nx+1nx+1−nx×Pr{At−1,x}×nx+1)=∑x=1+∞(nx+1)Pr{At−1,x}=E[it−1]+1 \begin{aligned} &\mathrm{Pr}\{A_{tx}\}=(1-\frac{1}{n_{x+1}-n_x})\mathrm{Pr}\{A_{t-1,x}\}+\frac{1}{n_x-n_{x-1}}\mathrm{Pr}\{A_{t-1,x-1}\}\\ &\begin{aligned} E[i_t]&=\sum_{x=1}^{+\infty}\mathrm{Pr}\{A_{tx}\}\times n_x\\ &=\sum_{x=1}^{+\infty}\left((1-\frac{1}{n_{x+1}-n_x})\times\mathrm{Pr}\{A_{t-1,x}\}\times n_x+\frac{1}{n_x-n_{x-1}}\times\mathrm{Pr}\{A_{t-1,x-1}\}\times n_x\right)\\ &=\sum_{x=1}^{+\infty}\left((1-\frac{1}{n_{x+1}-n_x})\times\mathrm{Pr}\{A_{t-1,x}\}\times n_x+\frac{1}{n_{x+1}-n_x}\times\mathrm{Pr}\{A_{t-1,x}\}\times n_{x+1}\right)\\ &=\sum_{x=1}^{+\infty}(n_x+1)\mathrm{Pr}\{A_{t-1,x}\}=E[i_{t-1}]+1 \end{aligned} \end{aligned} 因此 E[it]=tE[i_t]=t。
  2. 因为 ni=100in_i=100i,所以每次执行 INCREMENT\mathrm{INCREMENT} 时,计数器有 1/1001/100 的概率增加 1。因此 Pr{Atx}=(tx)1100x99100t−xD[in]=∑x=0nPr{Anx}(nx−E[in])2=∑x=0n(nx)1100x99100n−x(100x−n)2=∑x=0n(nx)1100x99100n−x(10000x(x−1)+(10000−200n)x+n2)=n(n−1)+(100−2n)n+n2=99n \begin{aligned} &\mathrm{Pr}\{A_{tx}\}=\binom{t}{x}\frac{1}{100}^x\frac{99}{100}^{t-x}\\ &\begin{aligned} D[i_n]&=\sum_{x=0}^n\mathrm{Pr}\{A_{nx}\}(n_x-E[i_n])^2\\ &=\sum_{x=0}^n\binom{n}{x}\frac{1}{100}^x\frac{99}{100}^{n-x}(100x-n)^2\\ &=\sum_{x=0}^n\binom{n}{x}\frac{1}{100}^x\frac{99}{100}^{n-x}\left(10000x(x-1)+(10000-200n)x+n^2\right)\\ &=n(n-1)+(100-2n)n+n^2=99n \end{aligned} \end{aligned} 更一般的,ni=din_i=di 时 D[in]=(d−1)nD[i_n]=(d-1)n。

5-2

  1. 显然,最坏情形下 DETERMINISTIC-SEARCH\mathrm{DETERMINISTIC\text{-}SEARCH} 要访问 n−k+1n-k+1 个下标。平均情形下,记 XX 为算法访问的下标个数,事件 AiA_i 为算法访问了 A[1]A[1] 到 A[i]A[i] 并且没有结束, Pr{Ai}=(n−ik)(nk)E[X]=1+∑i=1n−1Pr{Ai}=1+1(nk)∑i=1n−1(n−ik)=1+1(nk)∑i=1n−1(ik)=1+(nk+1)(nk)=n+1k+1 \begin{aligned} &\mathrm{Pr}\{A_i\}=\frac{\binom{n-i}{k}}{\binom{n}{k}}\\ &\begin{aligned} E[X]&=1+\sum_{i=1}^{n-1}\mathrm{Pr}\{A_i\}\\ &=1+\frac{1}{\binom{n}{k}}\sum_{i=1}^{n-1}\binom{n-i}{k}\\ &=1+\frac{1}{\binom{n}{k}}\sum_{i=1}^{n-1}\binom{i}{k}\\ &=1+\frac{\binom{n}{k+1}}{\binom{n}{k}}=\frac{n+1}{k+1} \end{aligned} \end{aligned}