1、what is 分治算法?
顾名思义,分治就是分而治之的意思,就是把一个复杂的问题分为两个或更多个相同或者相似的子问题,再把子问题分为更小的子问题……直到最后可以简单到直接求解,然后把问题的解合并的得到原问题的解。
2、分治算法的设计思想为
将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之
3、分治法适用情况
1)问题的规模缩小到一定程度可以容易解决;
2)问题可以分解为若干个规模较小的相同问题;
3)子问题的解可以合并为该问题的解;
4)各个子问题间相互独立。
4、分治法基本步骤
Step1:划分问题:把问题的实例划分成子问题。
Step2:递归求解:递归解决子问题。
Step3:合并问题:合并子问题的解得到原问题的解。
分治法与递归法是孪生兄弟。
5、可解决经典问题
(1)二分搜索
(2)大整数乘法
(3)Strassen矩阵乘法
(4)棋盘覆盖
(5)合并排序
(6)快速排序
(7)线性时间选择
(8)最接近点对问题
(9)循环赛日程表
(10)汉诺塔
其实思想大家都懂但具体怎么用呢?
—————————————————————————————————————————
例子1:快排
从数列中取一个基准数
划分问题:把比基准数小的数放在基准数的左方,大的放在右方。
递归求解:在各个分区中重复划分。
合并问题:递归结束则排序结束。
void quickSort(int s[], int start, int end) { if(end>start) { int i=start; int j=end; int x=s[start]; while(i<j) { //从右到左扫描直至找到第一个比基准数小的数 while(i<j && s[j]>x) j--; if(i<j) s[i++]=s[j]; //找到了就把他放到第i个位置 //从左到右扫描直至找到第一个比基准数大的数 while(i<j && s[i]<x) i++; if(i<j) s[j--]=s[i]; //找到了就把它放在第j个位置 } s[i]=x; //在第i个位置放置x //递归问题 quickSort(s, start, i-1); quickSort(s, i+1, end); } }