1.回溯算法概念
回溯算法就是回溯搜索法,回溯是递归的副产品,只要有递归就会有回溯,通常在递归函数的下面就会有回溯的逻辑。
2.回溯算法的效率
回溯搜索法实际是纯暴力的搜索,本质就是穷举,虽然可以增加一些剪枝操作,但其本质还是穷举。
3.用回溯算法解决的问题
回溯算法适用于那些只能暴力搜索,没有其他更高效的解法的问题,如下:
- 组合问题:N个数里面按一定规则找出k个数的集合。
- 排列问题:N个数按照一定的规则全排列,有几种排列方式。
- 切割问题:一个字符串按照一定的规则有几种切割方式。
- 子集问题:一个N个数的集合有几个符合条件的子集。
- 棋盘问题:N皇后,解数独等等。
组合是无序的,排列是有序的。
3.如何理解回溯法
回溯法解决的问题都可以抽象为树形结构,树的宽度就是需要处理的集合的大小(使用for循环解决),树的深度是递归的深度。
4.回溯法的模板
回溯三部曲:
(1)回溯函数的参数和返回值:回溯函数的返回值一般为void,参数一般是根据后面的逻辑确定。
(2)回溯函数的终止条件:在树中一般是找到结果或到叶子节点就把答案存起来结束本层递归。
(3)回溯搜索的遍历过程:回溯法一般是在集合中递归搜索,集合的大小构成树的宽度,递归的深度构成树的深度。
模板如下:
//回溯法的模板
void backtracking(参数) {
//终止条件
if(终止条件) {
存放结果;
return;
}
//单层递归的逻辑
for (选择本层集合中的元素) {
处理节点;
backtracking(路径, 选择列表); //递归
回溯,撤销处理结果;
}
return;
}