经典算法之回溯算法

算法之回溯框架

定义

​ 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯算法说白了就是穷举法。不过回溯算法使用剪枝函数,剪去一些不可能到达 最终状态(即答案状态)的节点,从而减少状态空间树节点的生成。回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。

基本框架

​ 几个概念要弄清楚:路径 选择列表 结束条件

其基本框架:

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return

    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

解释:首先在函数开始要写好结束条件,不然递归调用会无线递归下去。

​ 为什么要写for循环,一般来说类似多叉树就用for循环,二叉树可以用两个并列的递归。指的是有很多个剩下的选择(其实就是选择列表)。然后做出一个选择之后,就是在当前节点选择其任意一个子节点。然后递归调用可以看成是把选择的该子节点当成当前节点。

​ 为什么要撤销选择,因为当backtrace遍历到结束条件的那一层时,要返回上一层,进行另外一个子节点的选择时,要撤销上次做的选择,恢复到原来的选择列表。

例子

​ 值得看的几个例子是全排列N皇后数独

全排列

image-20200411174958375

N皇后

image-20200411175047896

解数独

image-20200411174912499

回溯算法leetcode专题

其中我主要是看了另外一篇博客,我觉得讲的非常棒。地址

你可能感兴趣的:(经典算法之回溯算法)