回溯算法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
找到一个可能存在的正确的答案;
在尝试了所有可能的分布方法后宣告该问题没有答案。
同时回溯算法和深度优先搜索算法关联密切,在某些情况下就是通过深度优先遍历思想实现。
深度优先搜索算法(DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深 的搜索树的分支。当结点 v 的所在边都己被探寻过,搜索将回溯 到发现结点 v 的那条边的起始结点。这一过程一直进行到已发现从源结点可达的所有结点为止。如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个进程反复进行直到所有结点都被访问为止。
回溯算法强调了深度优先搜索算法的用途,用一个不断变化的变量在尝试各种可能的过程中,搜索需要的结果。强调了 回退 操作对于搜索的合理性。
搜索问题的解,可以通过 遍历 实现。所以很多教程把「回溯算法」称为暴力解法。因此回溯算法用于 搜索一个问题的所有的解 ,通过深度优先遍历的思想实现。
可以通过具体的例子进行理解:比如:从全排列问题理解回溯算法
给定一个 没有重复 数字的序列(例如[1,2,3]),返回其所有可能的全排列。
总结搜索的方法:按顺序枚举每一位可能出现的情况,已经选择的数字在当前要选择的数字中不能出现。按照这种策略搜索就能够做到不重不漏。这样的思路,可以用一个树形结构表示。
说明:
每一个结点表示了求解全排列问题的不同的阶段,这些阶段通过变量的「不同的值」体现,这些变量的不同的值,称之为「状态」;
使用深度优先遍历有「回头」的过程,在「回头」以后,状态变量需要设置成为和先前一样 ,因此在回到上一层结点的过程中,需要撤销上一次的选择,这个操作称之为「状态重置」;
深度优先遍历,借助系统栈空间,保存所需要的状态变量,在编码中只需要注意遍历到相应的结点的时候,状态变量的值是正确的&#x