回溯法
一、回溯法
“回溯法”也称“试探法”。它是从问题的某一状态出发,不断“试探”着往前走一步,当一条路走到“尽头”不能再前进(拓展出新状态)的时候,再倒回一步或者若干步,从另一种可能的状态出发,继续搜索,直到所有的“路径(状态)”都一试探过。这种不断前进、不断回溯,寻找解的方法,称为“回溯法”。
深度优先搜索求解的时候,当找到目标结点之后,还要回头寻找初始结点到目标结点的解路径。而回溯法则不同,找到目标结点之后,搜索路径就是一条从初始结点到目标结点的解路径。回溯法实际上是状态空间搜索中,深度优先搜索的一种改进,是更实用的一种搜索求解方法。
二、深度优先搜索与回溯法的关系
1、深度优先搜索包含回溯,或者说回溯法是深度优先搜索的一种;
2、深度优先搜索需要控制如何实现状态之间的转移(拓展),回溯法就是深度优先搜索的一种控制策略;
3、回溯的过程中,并不需要记录整棵“搜索树”,而只需记录从初始状态到当前状态的一条搜索路径,是“线性链状”的,其最大优点是占用空间少;
4、深度优先搜索可以采用递归(系统栈)和非递归(手工栈)两种方法实现。递归搜索是系统栈实现一部分的回溯(如果需要记录一些特殊信息或较多的信息,还需要另外手工记录),而非递归是自己用手工栈模拟回溯的过程,所以实现起来略为复杂一点。
三、算法框架
1、递归回溯法算法框架[一]
int dfs(int k) {
for (int i = 1; i <= 算符种数; i++) {
if (满足条件) {
保存结果
if (到目的地) 输出解;
else dfs(k+1);
恢复:保存结果之前的状态{回溯一步}
}
}
}
2、递归回溯法算法框架[二]
int dfs(int k) {
if (到目的地) 输出解;
else {
for (int i = 1; i <= 算符种数; i++) {
if (满足条件) {
保存结果;
dfs(k+1);
恢复:保存结果之前的状态{回溯一步}
}
}
}
}