基本思想
分治法即分而治之,将规模为n的问题分解成k个规模较小的相似的子问题,这些子问题互相独立且与原问题的形式相同,递归地解出这些子问题,然后通过合并子问题的解来得到原问题的解。
简单的说就是将一个大的问题拆分成和它相似的小的问题,通过递归很容易求解出这些小问题,通过小问题的解合并求出大问题的解。
适用条件
- 问题规模缩小到一定程度就可以很容易的解决
- 该问题可以分解为若干个规模较小的相似的子问题
- 可以利用子问题的解合并出该问题的解
- 所分解出的小问题相互独立,不包含公共子问题
分治法的解题思路
分治法解题步骤如下:
- 分解原问题: 将原问题分解成若干个规模较小的、相互独立的、与原问题形式相同的子问题
- 解决子问题: 若子问题规模较小,容易被解决,则直接求解,否则递归地求解各个子问题
- 合并问题的解: 将各个子问题的解合并为原问题的解
分治法一般算法的设计模式
divide-and-conquer(P)
> {
> if |P|<=n0 return adhoc(P); //在P<=n0时,可以直接解决P
> divide P into P1,P2,... ,Pk; //将原问题分解
> for(i=1;i<=k;i++)
> yi=divide-and-conquer(Pi); //递归处理子问题
> return merge(y1,y2,...,yk); //合并子问题解
> }
分治法的改进措施
- 减少子问题的个数
- 预处理减少递归内部的计算量