算法第二章作业
一、对分治法思想的体会
1、分治法的基本思想
- 将要求解的较大规模的问题分割成k个更小规模的子问题。
- 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
- 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
注:在用分治法设计算法时,最好使子问题的规模大致相同,这是出于一种平衡子问题的思想。
2、一般的算法模式
divide-and-conquer(P)
{ if (|P|<=n0) return adhoc(P); //|P|<=n0表示P的规模不超过阈值n0,可直接求解。
divide P into smaller subinstances P1, P2, ..., Pk;//分解问题
for (i=1; i<=k; i++)
yi=divide-and-conquer(Pi);//递归解各子问题
return merge(y1, ..., yk); //算法Merge(y1, …, yk)表示将子问题的解合成P的解
}
其中,|p|表示问题P的规模;n0为不需要再分解问题的阈值;adhoc是基本子算法,可以直接求解;merge用于将子问题的解合并为原问题的解。
3、分治算法的时间复杂性

用主定理求解型为T(n)=aT(n/b)+O(nd)的递归方程
设a>=1和b>1是常数,f(n)是一个函数,T(n)是定义在非负整数集上的函数:T(n)=aT(n/b)+ O(nd) 。
4、分治法适用的情况
分治法所能解决的问题一般具有以下几个特征:
- 该问题的规模缩小到一定的程度就可以容易地解决
- 问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
- 利用该问题分解出的子问题的解可以合并为该问题的解;
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
二、结对编程感想
两个人一起编程和自己一个人编程的感受有很大的不同,认识到了每个人之间编程习惯的差异。
结对编程能够为解决问题提供更多的思路,可能小伙伴擅长的正是我所缺失的,能够大大提高解决问题的效率,与此同时,我们还能够互相发现各自在编程过程中出现的一些错误。不知道大家有没有过这样的体验:代码出现错误,但是自己找来找去都找不到问题所在,觉得自己哪也没错,但是当你让伙伴帮忙看一下时,对方却可以发现错误所在。可能是因为大家看自己的孩子(代码)总是会忽略掉它的缺点。
但它对于我来说,也存在一些问题。因为在编程过程中需要合作和讨论,我对于问题的专注力会有所下降,不能够全身心投入。

浙公网安备 33010602011771号