分治与递归
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
【程序1】一个简单例子
在一个整数组a[1...n]中,同时寻找最大值和最小值
【方法一】顺序扫描法
min=a[1];
max=a[1];
扫描数组,对i从2到n做:
如果a[i]max,则max = a[i];
返回max,min的值
【方法二】分治法
基本思想:
(1)划分:将数组分割成两半
(2)治理:在每一半中找到最大值和最小值。
(3)合并:返回两个最大值中的最大值和两个最小值中的最小值。
minmax(int left, int right){
if (right-left=1) //如果只有两个元素直接解决
if (a[left]<a[right]) return(a[left], a[right]);
else return(a[right],a[left]);
else //否则递归解决
mid=(left+right)/2; //将区间一分为二
(