0%

回溯算法

关于回溯,比较难的是理解 “回到过去”,现实世界里我们无法回到过去,但是在算法的世界里可以


思考

深度优先遍历、递归、栈它们三者之间的关系:

它们背后统一的逻辑都是后进先出


概念

回溯法 采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:

找到一个可能存在的正确的答案;
在尝试了所有可能的分步方法后宣告该问题没有答案。

(来自维基百科)


理解

回溯算法就是暴力穷举,解决回溯问题,典型的是利用决策树的结构,使用深度优先搜索(DFS)进行遍历,用一个不断变化的变量,试探各种可能的分步,寻找需要的结果,当发现有的分步不能得到有效解答的时候,只有取消上一次的计算,状态重置,回到之前的状态,这样再开始新的尝试才会是有效的

回溯算法框架:

1.结束条件

2.选择路径

3.状态重置


剪枝:

回溯算法可以用剪枝来进行优化,寻找过滤条件,减少不必要的过程,以加快搜索速度。

剪枝的预处理工作(例如排序)虽然会消耗时间,但剪枝节约的时间更多。

由于回溯穷举的特点,其本身时间复杂度就很高,所以可以尽可能的使用空间换取时间。