《算法导论》读书笔记(2)复杂度、分治策略 部分习题
2015-02-02 15:07
218 查看
继续。
第3章,函数的增长。这章比较简单。渐进符号,O, Θ, Ω。函数的上下界。
练习3.2-8,k*ln(k)>=C1*n; k*ln(k)<=C2*n; 解不等式,k=Θ(n/lnn)。
思考题3-6,a: n; b: lg*(n); c: log2(n); d: log2(n)-1; e: -lg(lg(n)); f: 无穷大; g: -log3(log2(n)); h: log(lgn)(n/2) //非最优;
第4章,分治策略。递归式,子问题,求解递归式的三种方法。对递归树法比较感兴趣。举了个最大子数组的例子。这个例子中分治与暴力枚举的区别在与,分治是先划中间点,寻找跨越中间点的一对最大最小点,然后在左右两个分划的区域继续寻找。这样,每层Θ(n),一共log2(n)层。而暴力枚举法需要对每个元素都检查n次,总共是Θ(n^2)。如果用非常不严谨的伪码表示:
递归树计算渐进紧确解。按层分解,每层各自求和后,求各层总和。主定理无感。
练习4.4-8,T(n)=T(n-a)-T(a)+cn,a是常数,所以总的层数是n/a,每层cn,故总计为Θ(n^2)。
练习4.4-9,T(n)=T(an)+T((1-a)n)+cn,令a>1/2,总层数为-log2(n)/log2(a),每层为cn,故总计为Θ(-n*log2(n)/log2(a))。那么如果a<1/2怎么办,令a=1-1/a,代入即可。
思考题4-5,两两测试,如果结果都是好的,那么两块都是好的,或者都是坏的。如果有一个测试是坏的,或者都是坏的,那么至少有一块是坏的。最终可以分为两堆,至少有一堆内部互相都测试为好的,堆之间交叉测试都是坏的。数量多的一堆是真正的好的。
方法:两两测试,好的都标为true对,true对中选一个与其他true对比较,把最终都是true的放一堆,false的放另一堆,可知此时true堆与false堆必有一堆为好一堆为坏。记为set1, set2, 剩下的是原来标为false对的记为set3。用set1中一个依次测set3中,得true则加入set1, set2中一个依次测set3中,得true加入set2,此时,set1与set2必有一堆超过半数,那么它们全部为true。完成。
思考题4-6,两个证明比较有意思。
先试一下初始值看看
A[i,j]+A[i+1,j+1]<=A[i,j+1]+A[i+1,j]
A[i,j]+A[i+2,j+2]=(A[i,j]+A[i+1,j+1])+(A[i+1,j+1]+A[i+2,j+2])-2*A[i+1,j+1]<=(A[i,j+1]+A[i+1,j])+(A[i+1,j+2]+A[i+2,j+1])-2*A[i+1,j+1]<=(A[i,j+2]+A[i+2,j])+2*(A[i+1,j+1])-2*A[i+1,j+1]=(A[i,j+2]+A[i+2,j])
可以证了。
1,假设任意l>=1,有A[i,j]+A[i+l,j+1]<=A[i,j+1]+A[i+l,j]
A[i+l,j]+A[i+l+1,j+1]<=A[i+l+1,j]+A[i+l,j+1]
相加(A[i,j]+A[i+l,j+1])+(A[i+l,j]+A[i+l+1,j+1])<=(A[i,j+1]+A[i+l,j])+(A[i+l+1,j]+A[i+l,j+1])
则A[i,j]+A[i+l+1,j+1]<=A[i,j+1]+A[i+l+1,j]
2,同理可证
对任意k>=1,有A[i,j]+A[i+1,j+k]<=A[i,j+k]+A[i+1,j]
则A[i,j]+A[i+1,j+k+1]<=A[i,j+k+1]+A[i+1,j]
3,假设任意l,k>=1,有A[i,j]+A[i+l,j+k]<=A[i,j+k]+A[i+l,j]
A[i,j]+A[i+l+1,j+k+1]=(A[i,j]+A[i+l,j+k])+(A[i+l,j+k]+A[i+l+1,j+k+1])-2*A[i+l,j+k]<=A[i,j+k]+A[i+l,j]+(A[i+l,j+k+1]+A[i+l+1,j+k])-2*A[i+l,j+k]<=(A[i+l+1,j]+A[i+l,j+k])+(A[i,j+k+1]+A[i+l,j+k])-2*A[i+l,j+k]=A[i+l+1,j]+A[i,j+k+1]
4,综上,A[i,j]+A[i+l,j+k]<=A[i,j+1]+A[i+1,j]推出A[i,j]+A[i+l,j+k]<=A[i,j+k]+A[i+l,j]
第二个证明题,归谬法。构建最小的元素在右对角线上。那么他们的和不可能大于左对角线两元素和。证毕。
第3章,函数的增长。这章比较简单。渐进符号,O, Θ, Ω。函数的上下界。
练习3.2-8,k*ln(k)>=C1*n; k*ln(k)<=C2*n; 解不等式,k=Θ(n/lnn)。
思考题3-6,a: n; b: lg*(n); c: log2(n); d: log2(n)-1; e: -lg(lg(n)); f: 无穷大; g: -log3(log2(n)); h: log(lgn)(n/2) //非最优;
第4章,分治策略。递归式,子问题,求解递归式的三种方法。对递归树法比较感兴趣。举了个最大子数组的例子。这个例子中分治与暴力枚举的区别在与,分治是先划中间点,寻找跨越中间点的一对最大最小点,然后在左右两个分划的区域继续寻找。这样,每层Θ(n),一共log2(n)层。而暴力枚举法需要对每个元素都检查n次,总共是Θ(n^2)。如果用非常不严谨的伪码表示:
function find(A){if count(A)<2 return 0; if count(A)==2 return A[end]-A[begin]; return max(find_cross(A),find(A前半),find(A后半));} function find_cross(A){return find_biggest_in(A后半)-find_smallest_in(A前半);}
递归树计算渐进紧确解。按层分解,每层各自求和后,求各层总和。主定理无感。
练习4.4-8,T(n)=T(n-a)-T(a)+cn,a是常数,所以总的层数是n/a,每层cn,故总计为Θ(n^2)。
练习4.4-9,T(n)=T(an)+T((1-a)n)+cn,令a>1/2,总层数为-log2(n)/log2(a),每层为cn,故总计为Θ(-n*log2(n)/log2(a))。那么如果a<1/2怎么办,令a=1-1/a,代入即可。
思考题4-5,两两测试,如果结果都是好的,那么两块都是好的,或者都是坏的。如果有一个测试是坏的,或者都是坏的,那么至少有一块是坏的。最终可以分为两堆,至少有一堆内部互相都测试为好的,堆之间交叉测试都是坏的。数量多的一堆是真正的好的。
方法:两两测试,好的都标为true对,true对中选一个与其他true对比较,把最终都是true的放一堆,false的放另一堆,可知此时true堆与false堆必有一堆为好一堆为坏。记为set1, set2, 剩下的是原来标为false对的记为set3。用set1中一个依次测set3中,得true则加入set1, set2中一个依次测set3中,得true加入set2,此时,set1与set2必有一堆超过半数,那么它们全部为true。完成。
思考题4-6,两个证明比较有意思。
先试一下初始值看看
A[i,j]+A[i+1,j+1]<=A[i,j+1]+A[i+1,j]
A[i,j]+A[i+2,j+2]=(A[i,j]+A[i+1,j+1])+(A[i+1,j+1]+A[i+2,j+2])-2*A[i+1,j+1]<=(A[i,j+1]+A[i+1,j])+(A[i+1,j+2]+A[i+2,j+1])-2*A[i+1,j+1]<=(A[i,j+2]+A[i+2,j])+2*(A[i+1,j+1])-2*A[i+1,j+1]=(A[i,j+2]+A[i+2,j])
可以证了。
1,假设任意l>=1,有A[i,j]+A[i+l,j+1]<=A[i,j+1]+A[i+l,j]
A[i+l,j]+A[i+l+1,j+1]<=A[i+l+1,j]+A[i+l,j+1]
相加(A[i,j]+A[i+l,j+1])+(A[i+l,j]+A[i+l+1,j+1])<=(A[i,j+1]+A[i+l,j])+(A[i+l+1,j]+A[i+l,j+1])
则A[i,j]+A[i+l+1,j+1]<=A[i,j+1]+A[i+l+1,j]
2,同理可证
对任意k>=1,有A[i,j]+A[i+1,j+k]<=A[i,j+k]+A[i+1,j]
则A[i,j]+A[i+1,j+k+1]<=A[i,j+k+1]+A[i+1,j]
3,假设任意l,k>=1,有A[i,j]+A[i+l,j+k]<=A[i,j+k]+A[i+l,j]
A[i,j]+A[i+l+1,j+k+1]=(A[i,j]+A[i+l,j+k])+(A[i+l,j+k]+A[i+l+1,j+k+1])-2*A[i+l,j+k]<=A[i,j+k]+A[i+l,j]+(A[i+l,j+k+1]+A[i+l+1,j+k])-2*A[i+l,j+k]<=(A[i+l+1,j]+A[i+l,j+k])+(A[i,j+k+1]+A[i+l,j+k])-2*A[i+l,j+k]=A[i+l+1,j]+A[i,j+k+1]
4,综上,A[i,j]+A[i+l,j+k]<=A[i,j+1]+A[i+1,j]推出A[i,j]+A[i+l,j+k]<=A[i,j+k]+A[i+l,j]
第二个证明题,归谬法。构建最小的元素在右对角线上。那么他们的和不可能大于左对角线两元素和。证毕。
相关文章推荐
- 《算法导论》笔记(1)排序 含部分习题
- 《编程珠玑》读书笔记4------------第四章部分习题及个人答案
- 算法导论第二章部分习题自我解答
- 算法导论-第六部分-读书笔记
- 算法导论(3版)第4章习题的部分解答
- 算法导论-第五部分-读书笔记
- 《算法导论》笔记(6)链表到红黑树 部分习题
- 《算法导论》笔记(14) 基本的图算法 部分习题
- 《算法导论》笔记(17) 所有结点对最短路径 部分习题
- 算法导论-3.递归部分习题选
- 《算法导论》笔记(16) 单源最短路径 部分习题
- 《算法导论》笔记(9) 动态规划 部分习题
- 《算法导论》读书笔记--第四章 分治策略
- 《算法导论》笔记(10)贪心算法 部分习题
- 《算法导论》笔记(15) 最小生成树 部分习题
- 《算法导论》笔记(11) 摊还分析 部分习题
- 算法导论 第7章部分习题解答
- 算法导论-第四部分-读书笔记
- 算法导论-第三部分-读书笔记
- 《算法导论》笔记(18) 最大流 含部分习题