目录
分治算法:
1.分治算法就是将原问题划分为成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
(递归:程序调用自身的编程技巧称为递归)
2.分治算法的递归实现中,每一层递归都会涉及到这样的三个操作:
——分解:将原问题分解成一系列子问题
——解决:递归地求解各个子问题,若子问题足够小,则直接求解
——合并:将子问题的结果合并成原问题
3.分治算法能够解决的问题一般满足以下条件:
——原问题与分解成的小问题有相同的模式
——原问题分解成的子问题可以独立求解,子问题之间没有相关性。
——具有分解终止条件,也就是说,当问题足够小时,可以直接求解。
——可以将子问题合并成原问题,而这个合并操作的复杂度不能够太高,否则就起不到减小算法总体复杂度的效果了。
回溯算法:
回溯算法是一个类似于枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当搜索到某一步时,发现原先选择并不是优解或者达不到目标。就退回一步重新选择,这种走不通就回退再走的技术称为回溯法,而满足回溯状态的某个点称为回溯点。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
相关问题与代码实现:
一:前n项和
public class RecursionDemo02 {
public static void main(String[] args) {
int ret = f(100);
System.out.println(ret);
}
private static int f(int n) {
if (n == 1) {
return 1;
}
return f(n - 1) + n;
}
}
二:斐波那契数列
public class RecursionDemo03 {
public static void main(String[] args) {
int ret = f(5);
System.out.println(ret);
}
private static int f(int x) {
if (x == 1 || x == 2) {
return 1;
}
return f(x - 1) + f(x - 2);
}
}
三:二分查找
public class RecursionDemo04 {
private static int count = 0;
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int index = binarySearch(arr,0,arr.length - 1,13);
System.out.println(index);
System.out.println(count);
}
//在数组arr中 L~R区间内进行二分搜索查找key的角标
private static int binarySearch(int[] arr, int L, int R, int key) {
count++;
if (L > R) { //元素key不存在
return -1;
}
int M = (L + R) / 2;
if (arr[M] == key) {
return M;
}
if (arr[M] < key) {
return binarySearch(arr,M + 1,R,key);
} else {
return binarySearch(arr,L,M - 1,key);
}
}
}
四:文件查找:
public class RecursionDemo05 {
public static void main(String[] args) {
File dir = new File("C:\\Users\\32519\\Desktop\\DS");
traversal(dir);
}
private static void traversal(File dir) {
File[] files = dir.listFile