您的位置:首页 > 其它

《算法导论》读书笔记(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)。如果用非常不严谨的伪码表示:

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]

第二个证明题,归谬法。构建最小的元素在右对角线上。那么他们的和不可能大于左对角线两元素和。证毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: