经典算法之回溯算法
算法之回溯框架
定义
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯算法说白了就是穷举法。不过回溯算法使用剪枝函数,剪去一些不可能到达 最终状态(即答案状态)的节点,从而减少状态空间树节点的生成。回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。
基本框架
几个概念要弄清楚:路径 选择列表 结束条件
其基本框架:
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
解释:首先在函数开始要写好结束条件,不然递归调用会无线递归下去。
为什么要写for循环,一般来说类似多叉树就用for循环,二叉树可以用两个并列的递归。指的是有很多个剩下的选择(其实就是选择列表)。然后做出一个选择之后,就是在当前节点选择其任意一个子节点。然后递归调用可以看成是把选择的该子节点当成当前节点。
为什么要撤销选择,因为当backtrace遍历到结束条件的那一层时,要返回上一层,进行另外一个子节点的选择时,要撤销上次做的选择,恢复到原来的选择列表。
例子
值得看的几个例子是全排列、N皇后、数独
其中我主要是看了另外一篇博客,我觉得讲的非常棒。地址

浙公网安备 33010602011771号