算法第二章作业

分治法:把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础。

分治策略:对一个规模为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的能力,了解到别人的思维方式

posted @ 2019-10-10 16:10  Kayee1802  阅读(151)  评论(0编辑  收藏  举报