回溯和深度优先搜索的区别
回溯是一种更通用的算法。可以用于任何类型的结构,其中可以消除域的部分 ——无论它是否是逻辑树。
深度优先搜索是与搜索树或图结构相关的特定回溯形式。它使用回溯作为其使用树的方法的一部分,但仅限于树/图结构。
回溯和 DFS 之间的区别在于回溯处理隐式树而 DFS 处理显式树。这似乎微不足道,但它意味着很多。当通过回溯访问问题的搜索空间时,隐式树在其中间被遍历和修剪。然而对于 DFS 来说,它处理的树/图是明确构造的,并且在完成任何搜索之前已经抛去了不可接受的情况,即修剪掉了。
因此,回溯是隐式树的 DFS,而 DFS 是回溯而不修剪。
也并不简单的可以说回溯算法 = 深度优先搜索 + 剪枝函数。因为并不是所有图都是树。
回溯的关键不在于递归,而在于“状态”。在回溯算法向前的每一步,你都会去设置某个状态,而当向前走走不通的时候回退,此时需要把之前设置的状态撤销掉。
dfs 只是找某个或某些满足条件的东西而已,找到就返回,找不到拉倒,没状态,也可以携带路径和边界值。
dfs如果带上记忆搜索集(类似动态规划),就变成了记忆搜索,保存是之前搜索过的子搜索集,子搜索集也是一种剪枝过程。(子搜索集有点类似后缀树)
回溯法如果带上记忆搜索集,就变成记忆回溯,保存是之前搜索过的子搜索集,子搜索集也是一种剪枝过程。和记忆搜索的区别也是回溯有一个状态保存的性质。
回溯法的基本思想:
- 针对所给问题,定义问题的解空间;
- 确定易于搜索的解空间结构;
- 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
八皇后问题是一种经典的回溯算法问题
在八皇后问题中,我们需要在一个8x8的棋盘上放置8个皇后,使得任何两个皇后都不在同一行、同一列或同一斜线上。为了解决这个问题,我们可以采用回溯算法,从第一行开始,逐行枚举皇后所在的列,如果符合条件则进入下一行,否则回溯到上一行,继续尝试下一个列。
在这个过程中,我们需要回溯到上一行来重新选择列,这就是典型的记忆回溯的过程。通过不断地回溯到上一行来重新选择列,我们最终能够找到符合要求的解。因此,八皇后问题属于记忆回溯的范畴。
参考链接
回溯详解以及与 DFS 算法的关联
回溯vs记忆化递归
记忆搜索———至少有 1 位重复的数字
DFS参数携带路径或者边界值