经典算法之回溯算法

算法之回溯框架

定义

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

基本框架

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

其基本框架:框架

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

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

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

​ 为何要写for循环,通常来讲相似多叉树就用for循环,二叉树能够用两个并列的递归。指的是有不少个剩下的选择(其实就是选择列表)。而后作出一个选择以后,就是在当前节点选择其任意一个子节点。而后递归调用能够当作是把选择的该子节点当成当前节点。code

​ 为何要撤销选择,由于当backtrace遍历到结束条件的那一层时,要返回上一层,进行另一个子节点的选择时,要撤销上次作的选择,恢复到原来的选择列表。递归

例子

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

全排列get

image-20200411174958375

N皇后博客

image-20200411175047896

解数独it

image-20200411174912499

回溯算法leetcode专题

其中我主要是看了另一篇博客,我以为讲的很是棒。地址

相关文章
相关标签/搜索