算法第二章作业
分治法:把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础。
分治策略:对一个规模为n的问题,若该问题可以容易地解决(即n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。
从分治法的一般设计模式可以看出,用它设计出的程序一般是递归算法,因此分治法计算效率通常可以用递归方程来进行分析。一个分治法将规模为n的问题分成k个规模为n/m的子问题去解决。
分治法的适用情况:
1.该问题的规模缩小到一定程度就可以解决
2.该问题可以分解为若干个较小的相同问题
3.利用该问题分解出的子问题的解可以合并为该问题的解
4.该问题分解出的各个子问题是相互独立的
分治法的步骤:
1.分解
2.解决
3.合并
template<class Type> void MergeSort (Type a[], int left, int right){ if(left<right){ int i = (left+right)/2; MergeSort(a,left,i); MergeSort(a,i+1,rigth); Merge(a,b,left,i,right); Copy(a,b,left,right); } }
可使用分治法求解的一些经典问题
1)二分搜索
2)大整数乘法
3)Strassen矩阵乘法
4)棋盘覆盖
5)合并排序
6)快速排序
7)线性时间选择
8)最接近点对问题
9)循环赛日程表
10)汉诺塔
结对编程感想
结对编程编写同一题目时,两个人分别做,不同的思维方式,当遇到bug时再一起解决,就可以有不同的解决思路,学会改bug的能力,了解到别人的思维方式