分治算法(divide and conquer)
算法设计思想:
分(divide):递归解决较小的问题(基本情况除外)。
治(conquer):从子问题的解构建原问题的解。
适合用分治法的问题:
当求解一个输入规模非常大的问题时,用暴力法效率一般得不到保证,如果问题能满足以下几个条件,就可以采用分治法提高解决效率:
- 能将这n个数据分解成k个不同的子集合,且得到k个子集合是可以独立求解的子集问题,1<k<=n
- 分解所得到的子问题与原问题具有相似的结构,便于利用递归或循环机制
- 在求出子问题的解可以推出原问题的解。
对于一些重叠子问题类的题目,用动态规划是一种较好的解决办法
典型采用分治算法的例子:二分法查找,归并排序,快速排序,二叉树遍历(先遍历左子树再遍历右子树),二叉排序树的查找等算法。
下面从具体题目中理解分治算法的含义
典型算法之折半查找
public class BinarySearch {
/**
* 二分查找
* @param num 需要查找的数组(必须为有序数列)
* @param n 待查找的值
* @param left 数组开始下标
* @param right 数组结尾下标
* @return 返回该值在数组中的位置,不存在则返回-1
*/
public static int Search(int[] num,int n,int left,int right) {
int mid = (left + right) / 2;
if(n == num[mid])
return mid+1; //若n等于当前中间元素则返回下标
if(left<right) { //如果left小于right,说明没有查找完
if(n > num[mid]) //如果大于中间值,则从右半部查找
return Search(num,n,mid+1,right);
else //否则从左半部查找
return Search(num,n