分治算法(Divide-and-Conquer):
就是“分而治之”的意思,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
适用场景:
该问题的规模缩小到一定的程度就可以容易的解决。
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
利用该问题分解出的子问题的解可以合并为该问题的解。
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
常用于二分搜索、大整数乘法、Strassen矩阵乘法、棋盘覆盖、合并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表。
方法步骤:
1、分解:将原问题分解为若干个规模较小,相互独立且与原问题形式相同的子问题
2、解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
3、合并:将各个子问题的解合并为原问题的解。
案例一
题目:二分查找(搜索)(要求1.必须采用顺序存储结构 2.必须按关键字大小有序排列。)
分析:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后,将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。
package com.camunda.annotation;
public class binarySearchDemo {
public static void main(String[] args) {
int[] arr = {
6, 12, 33, 87, 90, 97, 108, 561};
System.out.println("循环查找:" + binarySearch(arr, 87));
System.out.println("递归查找:" + binSearch(arr, 0, arr.length - 1, 87));
}
public static int binarySearch(int[] srcArray, int des) {
int low = 0;
int high = srcArray.length - 1;
while (low <= high) {
int middle = (high + low) >>> 1;
if (des == srcArray[middle]) {
return middle;
} else if (des < srcArray[middle]) {
high = middle - 1;
}