算法导论第二版习题
lslwsjly
这个作者很懒,什么都没留下…
展开
-
2.1-4
形式化描述: 给定长度均为n的bool数组A与B,分别代表整数A`和B`的二进制表示(数组从左到右为数的高位到低位)。求一个n+1位的bool数组C,使得C代表的整数C`=A`+B` 伪代码如下ADD(A, B) C = new bool[A.length+1] carry = false for i = 1 to A.length C[i] = (A[i原创 2015-05-29 16:32:53 · 229 阅读 · 0 评论 -
2.1-1
算法导论习题原创 2015-05-29 16:24:16 · 226 阅读 · 0 评论 -
2.1-2
INSERTION-SORT(A) for j=2 to A.length key = A[j] i = j - 1 while i > 0 and A[i] < key A[i+1] = A[i] i = i-1 A[i+1] = key原创 2015-05-29 16:27:48 · 242 阅读 · 0 评论 -
2.1-3
LINEARSEARCH(A, v) for i = 1 to A.length if v == A[i] return i return NIL我们来证明第k次循环结束后,v==A[k]或v不在A[1…k]中 初始化:当k=1时,A[1]为空,要么v==A[1]要么v≠A[1]。满足 保持:在第k次循环中,若v==A[k]则得证,若v≠A[k],由于A[原创 2015-05-29 16:31:01 · 190 阅读 · 0 评论 -
2.2-1
最高项是n3n^3,所以是Θ(n3)\Theta(n^3)原创 2015-05-29 16:35:56 · 274 阅读 · 0 评论 -
2.2-2
SELECTION-SORT(A) for i =1 to A.length-1 min = i for j = i+1 to A.length if(A[i] > A[j]) min = j tmp = A[i] A[i] = A[min]原创 2015-05-29 16:42:07 · 207 阅读 · 0 评论 -
2-2
问题a: 我们还需说明A’是A中所有元素的一种排列问题b: 证明第二个循环的不变式 每一次循环开始时,A[j]是A[j…n]中最小的 初始化:j=n显然成立 保持:上一次循环开始时,A[j+1]是A[j+1…n]中最小的,循环结束后,A[j]小于A[j+1],所以A[j]是A[j…n]中最小的 结束:结束时A[i]是A[i…n]中最小的问题c: 第一个循环的不变式 每一次循环开始时A原创 2015-05-29 19:05:36 · 130 阅读 · 0 评论 -
2.3-3
我们令k = lgn,则对k进行归纳 当k=1时,T(2)=2成立 当k=2时,T(4) = 8=2(22)2(2^2)成立 当k=m(m>2)时,假设T(2m)=m(2m)T(2^m)=m(2^m) 则当k=m+1时, T(2m+1)=2T(2m)+2m+1=(m+1)2(m+1)T(2^{m+1})=2T(2^m)+2^{m+1}=(m+1)2^{(m+1)} 故由数学归纳法,对于一原创 2015-05-29 18:48:59 · 275 阅读 · 0 评论 -
2.3-4
代码戳这里时间递归式为 T(1)=Θ(1)T(1) = \Theta(1) T(n)=T(n−1)+Θ(n)T(n) = T(n-1) + \Theta(n)原创 2015-05-29 18:50:39 · 183 阅读 · 0 评论 -
3.1-1
∵f(n)+g(n)2<=max(f(n),g(n))<=f(n)+g(n)\because\frac{f(n)+g(n)}{2}<=max(f(n), g(n))<=f(n)+g(n) ∴max(f(n),g(n))=Θ(f(n)+g(n))\therefore max(f(n), g(n))=\Theta(f(n)+g(n))原创 2015-05-29 22:15:45 · 282 阅读 · 0 评论 -
3.1-4
∵令c1=3,n0=1,则\because 令c_1=3,n_0=1,则 2n+1<=c12n,对n≥n0成立2^{n+1}<=c_12^n,对n\geq n_0成立 ∴2n+1=O(2n)\therefore 2^{n+1}=O(2^n)∵∀正常数c,总是存在n0=lgc使得当n≥n0时有22n≥c2n\because \forall 正常数c ,总是存在n_0=lgc使得当n\geq n_0原创 2015-05-29 22:56:49 · 243 阅读 · 0 评论 -
3.1-8
题目有点问题,c不应该是整数 Ω(g(n,m))={f(n,m):∃c>0,正整数n0和m0,使得对所有的n≥n0,m≥m0,有0≤cg(n,m)≤f(n,m)}\Omega(g(n,m))=\{f(n,m):\exists c>0,正整数n_0和m_0,使得对所有的n\geq n_0,m\geq m_0,有0\leq cg(n,m)\leq f(n,m)\} Θ(g(n,m))={f(n,m)原创 2015-05-30 10:34:01 · 277 阅读 · 0 评论 -
3.2-2
logb(1/a)=logb(a−1)=−logbalog_b(1/a)=log_b(a^{-1})=-log_ba logba=logaalogab=1logablog_ba=\frac{log_aa}{log_ab}=\frac{1}{log_ab} alogbc=clogca⋅logbc=clogbaa^{log_bc}=c^{log_ca\cdot log_bc}=c^{log_ba}原创 2015-05-30 11:04:28 · 179 阅读 · 0 评论 -
3-2
A B OO oo Ω\Omega ω\omega Θ\Theta lgknlg^kn nεn^\varepsilon 是 是 否 否 否 nkn^k cnc^n 是 是 否 否 否 n‾‾√\sqrt n nsinnn^{\sin n} 否 否 否 否 否 2n2^n 2n/22^{n原创 2015-05-30 15:03:33 · 238 阅读 · 0 评论 -
3-3
这题真麻烦。。。 从最小的常数开始 排序如下: 等价类 成员 1 1,n1/lgn1,n^{1/lgn} 2 lg(lg∗n)lg(lg^*n) 3 lg∗(lgn)lg^*(lgn) 4 2lg∗n2^{lg^*n} 5 lnlnn\ln\ln n 6 lgn‾‾‾‾√\sqrt {\lg n} 7 lnn\ln n 8 l原创 2015-05-30 15:37:23 · 204 阅读 · 0 评论 -
3.1-2
∵12(1+an)b<=(1+an)b<=2b(当n>=a)\because \frac12(1+\frac an)^b<=(1+\frac an)^b<=2^b (当n>=a) ∴令c1=12(1+an)b,c2=2b,n0=a,有\therefore 令c_1 = \frac12(1+\frac an)^b, c_2=2^b,n_0=a,有 c1nb<=(n+a)b<=c2nb,在n≥n0时原创 2015-05-29 22:33:09 · 214 阅读 · 0 评论 -
3.2-1
∵f(n)单调增\because f(n)单调增 ∴∀m,n,m<=n,有f(m)≤f(n)\therefore \forall m,n,m<=n,有f(m)\leq f(n) ∵g(n)单调增\because g(n)单调增 ∴∀m,n,m<=n,有g(m)≤g(n)\therefore \forall m,n,m<=n,有g(m)\leq g(n)∀m,n,m<=n\forall m,n,原创 2015-05-30 10:59:33 · 201 阅读 · 0 评论 -
3.1-3
至少反映的是大于等于关系,O反映的是小于等于关系,合在一起没有意义原创 2015-05-29 22:37:53 · 304 阅读 · 0 评论 -
3.1-5
充分性: ∵f(n)=O(g(n))\because f(n)=O(g(n)) ∴∃c1,n1,使得当n≥n1时,有f(n)≤c1g(n)\therefore \exists c_1, n_1,使得当n\geq n_1时,有f(n)\leq c_1g(n) ∵f(n)=Ω(g(n))\because f(n)=\Omega(g(n)) ∴∃c2,n2,使得当n≥n2时,有f(n)≥c2g(n原创 2015-05-29 23:07:12 · 226 阅读 · 0 评论 -
3.1-7
若存在f(n),使得f(n)∈o(g(n))∩ω(g(n)),则∃n1,n2有若存在f(n),使得f(n)\in o(g(n))\cap \omega (g(n)),则\exists n_1,n_2有 f(n)<12g(n)(n≥n1),f(n)>g(n)(n≥n2)f(n)< \frac12g(n)(n\geq n_1),f(n)> g(n)(n\geq n_2) 注意:第二版教材用的仍是≥,原创 2015-05-30 10:19:42 · 234 阅读 · 0 评论 -
3.2-4
f(n)多项式有解即存在c1,c2,n0使得n>=n0时有f(n)多项式有解即存在c_1,c_2,n_0使得n>=n_0时有 c1nk≤f(n)≤c2nk成立,即lgc1+klgn≤lgf(n)≤lgc2+klgnc_1n^k\leq f(n) \leq c_2n^k成立,即lgc_1+klgn\leq lgf(n) \leq lgc_2+klgn 故lgf(n)=Θ(lgn)lgf(n)=\T原创 2015-05-30 13:11:21 · 311 阅读 · 0 评论 -
2.2-3
平均情况下检查次数为n(n+1)2n=(n+1)2\frac{n(n+1)}{2n} = \frac{(n+1)}{2} 最坏情况下查找次数为n次 故复杂度均为Θ(n)\Theta(n)原创 2015-05-29 18:39:51 · 242 阅读 · 0 评论 -
2.2-4
在最开始时对输入数据先进行检验,如果已经是最优结果就直接输出原创 2015-05-29 18:42:46 · 213 阅读 · 0 评论 -
2.3-2
伪代码就不写了,直接上C++代码戳这里原创 2015-05-29 18:42:39 · 249 阅读 · 0 评论 -
2.3-5
最坏情况下,每一次查询都没有命中,每一次查询都将查找区间变为原来的一半 故T(n)=T(n/2)+Θ(1)T(n)=T(n/2) + \Theta(1),求解可得T(n)=Θ(lgn)T(n)=\Theta(lgn) 代码戳这里这里写链接内容原创 2015-05-29 18:53:26 · 253 阅读 · 0 评论 -
2.3-7
不考虑hash算法 代码戳这里算法如下: 1.先对数组A从小到大排序 2.令left为0,right为n-1(n为A长度) 3.若left == right 返回失败,否则检查A[left]+A[right]是否等于x,若等于则返回成功,否则若小于x,则left++,若大于x,则right–,然后重复步骤3证明: 若本身无解,算法显然会返回失败若有解,我们总能找到一组解(a,b),b-a是原创 2015-05-29 18:58:41 · 235 阅读 · 0 评论 -
2-1
问题a: 对于长度为k的数组插入排序,时间复杂度为Θ(k2)\Theta(k^2),n/k个数组的复杂度为Θ(n/k⋅k2)=θ(nk)\Theta(n/k \cdot k^2)=θ(nk) 问题b: 递归树的层数为Θ(lg(n/k))\Theta(lg(n/k)),每一次合并代价均为Θ(n)\Theta(n)(与标准merge没区别)故复杂度为Θ(nlg(n/k))\Theta(nlg(n/原创 2015-05-29 19:05:47 · 263 阅读 · 0 评论 -
2-3
问题a: i从n循环到0,所以复杂度为Θ(n)\Theta(n)问题b:y=0for i = 0 to n a = a[i] for j = 1 to i a = a * x y = y + a时间复杂度为Θ(n2)\Theta(n^2)问题c: 初始i=n,y=0成立 循环:第t步开始前y=∑n−(t+1)k=0ak+t+1xky=\sum_原创 2015-05-29 19:16:16 · 183 阅读 · 0 评论 -
2-4
问题a 逆序对为(2,1),(3,1),(8,6),(8,1),(6,1)问题b 当这个数组按照从大到小排序时,逆序对最多为 s=(n−1)(1+(n−1))2=n(n−1)2s=\frac{(n-1)(1+(n-1))}{2}=\frac{n(n-1)}{2}问题c 应当成正比关系 插入排序的时间开销主要在数组的移动上,每移动一次就意味着将一个逆序对变为顺序对,故逆序对的个数与移动次数成原创 2015-05-29 20:55:55 · 214 阅读 · 0 评论 -
3.2-5
若我们令t=lg∗nt=lg^*n,则lg(lg∗n)=lgt,lg∗(lgn)=t−1lg(lg^*n)=lgt,lg^*(lgn)=t-1 故容易看出后者渐近上更大原创 2015-05-30 13:14:30 · 235 阅读 · 0 评论 -
3.2-7
5‾‾√(Fi+2−ϕi)=ϕi⋅ϕ2−(1−ϕ)i+2−5‾‾√ϕi\sqrt5(F_{i+2}-\phi^i)=\phi^i\cdot \phi^2-(1-\phi)^{i+2}-\sqrt5\phi^i =ϕi⋅(1−ϕ)2−(1−ϕ)i+2=(1−ϕ)2⋅(ϕi−(1−ϕ)i)=\phi^i\cdot (1-\phi)^2-(1-\phi)^{i+2}=(1-\phi)^2\cdot (\原创 2015-05-30 14:34:52 · 193 阅读 · 0 评论 -
3-4
a错误 n=O(n2),n2≠O(n)n=O(n^2),n^2\neq O(n) b错误 n+n2≠Θ(n)n+n^2\neq\Theta(n) c正确 f(n)=O(g(n)),则∃c,n0使得当n≥n0时,f(n)≤cg(n)f(n)=O(g(n)),则\exists c,n_0使得当n\geq n_0时,f(n)\leq cg(n) 故lg(f(n))≤lg(g(n))+lgc≤(原创 2015-05-30 16:05:10 · 187 阅读 · 0 评论 -
2.3-6
不能 虽然可以减少查询对应位置的时间,但为了把元素置入对应位置,需要将其后的元素顺次后移,开销为Θ(n)\Theta(n)无法减少,所以复杂度仍为Θ(n2)\Theta(n^2)原创 2015-05-29 18:55:17 · 204 阅读 · 0 评论 -
3.1-6
充分性: ∵Tworst=O(g(n))\because T_{worst}=O(g(n)) ∴∃c1,n1,使得当n≥n1时,Tworst≤c1g(n)\therefore \exists c_1,n_1,使得当n\geq n_1时,T_{worst}\leq c_1g(n) 同理∃c2,n2,使得当n≥n2时,Tbest≥c2g(n)同理\exists c_2,n_2,使得当n\geq n原创 2015-05-30 09:58:32 · 253 阅读 · 0 评论 -
3.2-3
不进行特别严格的数学分析∵32πn√en单调减趋近于0的\because\frac{3\sqrt{2\pi n}}{e^n}单调减趋近于0的 ∴∀c>0,总能找到正整数n0使得,32πn√en<c\therefore \forall c>0,总能找到正整数n_0使得,\frac{3\sqrt{2\pi n}}{e^n}<c ∴∀c>0,∃n0,使得n!<32πn√ennn<cnn\therefo原创 2015-05-30 12:28:20 · 213 阅读 · 0 评论 -
3.2-6
当n=0时F0=0F_0=0显然成立 当n=1时F1=1F_1=1显然成立 假设当n≤kn\leq k时有Fk=ϕk−ϕ̂ k5√F_k=\frac{\phi ^k-\hat\phi^k}{\sqrt5} 则当n=k+1时,Fk+1=Fk+Fk−1=ϕk−ϕ̂ k+ϕk−1−ϕ̂ k−15√F_{k+1}=F_k+F_{k-1}=\frac{\phi ^k-\hat\phi^k+\phi ^{原创 2015-05-30 14:04:00 · 200 阅读 · 0 评论 -
4.2-1
每一层的开销是(3/2)in(3/2)^in 层数为lgnlgn T(n)=Θ((3/2)lgnn)=Θ(nlg3)T(n)=\Theta((3/2)^{lgn}n)=\Theta(n^{lg3})猜测T(n)≤cnlg3猜测T(n)\leq cn^{lg3} T(n)≤3cn2lg3=cnlg3T(n)\leq 3c\frac n2^{lg3}=cn^{lg3} 所以T(n)=O(nlg3原创 2015-06-02 22:43:37 · 221 阅读 · 0 评论 -
4.1-6
我们令n=2m,则T(2m)=2T(2m/2)+1我们令n=2^m,则T(2^m)=2T(2^{m/2})+1 令S(m)=T(2m),则S(m)=2S(m/2)+1令S(m)=T(2^m),则S(m)=2S(m/2)+1 容易得证S(m)=Θ(m),则T(n)=Θ(lgn)容易得证S(m)=\Theta(m),则T(n)=\Theta(lgn)原创 2015-06-02 22:11:48 · 215 阅读 · 0 评论 -
3-6
f(n)f(n) c f∗c(n)f^*_c(n) n−1n-1 0 Θ(n)\Theta(n) lgn\lg n 1 Θ(lg∗n)\Theta(lg^*n) n/2n/2 1 Θ(lgn)\Theta(lgn) n/2n/2 2 Θ(lgn)\Theta(lgn) n‾‾√\sqrt n 2 Θ(lglgn)\Theta(lglg原创 2015-06-02 18:59:26 · 142 阅读 · 0 评论 -
4.1-2
我们猜测T(n)≤cnlgn我们猜测T(n)\leq cnlgn T(n)≤2c(n/2)lg(n/2)+n=cnlgn+n−cn≤cnlgn,最后一步当c≤1成立T(n)\leq 2c(n/2)lg(n/2)+n=cnlgn+n-cn\leq cnlgn,最后一步当c\leq1成立 我们猜测T(n)≥c(n+1)lg(n+1)我们猜测T(n)\geq c(n+1)lg(n+1) T(n)≥2原创 2015-06-02 20:01:22 · 273 阅读 · 0 评论