回溯算法

一.简介

      回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法;基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。它可以系统的搜索一个问题的所有解和任意解,是一种既带有系统性又带有跳跃性的搜索算法,有“通用的解题法”之称。

可以看作DFS+剪枝函数。


 适用场景:当遇到某一类问题时,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。回溯法的优点在于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。但是,对于可以得出明显的递推公式迭代求解的问题,还是不要用回溯法,因为它花费的时间比较长(不到万不得已,不要用回溯法,费时)

递归和回溯

递归是一种算法结构,回溯是一种算法思想;一个递归就是在函数中调用函数本身来解决问题;回溯就是通过不同的尝试来生成问题的解,有点类似于穷举,但是和穷举不同的是回溯会“剪枝”,意思就是对已经知道错误的结果没必要再枚举接下来的答案了,比如一个有序数列1,2,3,4,5,我要找和为5的所有集合,从前往后搜索我选了1,然后2,然后选3 的时候发现和已经大于预期,那么4,5肯定也不行,这就是一种对搜索过程的优化。


二.基本思想及实现

(1)首先要将问题转化,得出解空间树。这棵树的每条完整路径都代表了一种解的可能。通过深度优先搜索这棵树,枚举每种可能的解的情况;从而得出结果。但是回溯法搜索解空间树时,通常采用两种策略来避免无效搜索,提高回溯法的搜索效率。

其一是约束函数:在扩展节点处剪去不满足约束的子树

其二是用限界函数:剪去得不到最优解的子树

这两类函数统称为剪枝函数

回溯有递归回溯和迭代回溯【可以参考树得非递归遍历】(反正后者我不用)

 //伪代码
    void Backtrack(int t) {
        if (t > n) {
            Output(x);
        } else {
            for (int i = f(n, t); i <= g(n, t); i++) {//f,g分别表示当前扩展节点处未搜索过的子 
                                                                      //树的起始和终止编号
                x[t] = h(i);//h(i)当前扩展节点处第i个可选值
                if (Constraint(t) && Bound(t))
                    Backtrack(t + 1);
            }
        }
}

(2)回溯法的实现步骤

通过读题完成下面三个步骤:
1)描述解的形式,定义一个解空间,它包含问题的所有解。
2)构造状态空间树。
3)构造约束函数(用于杀死节点)。
然后就要通过深度优先搜索思想完成回溯,完整过程如下:
1)设置初始化的方案(给变量赋初值,读入已知数据等)。
2)变换方式去试探,若全部试完则转(7)。
3)判断此法是否成功(通过约束函数),不成功则转(2)。
4)试探成功则前进一步再试探。
5)正确方案还未找到则转(2)。
6)已找到一种方案则记录并打印。
7)退回一步(回溯),若未退到头则转(2)。
8)已退到头则结束或打印无解


三 .子集树和排列数

子集树和排列数是回溯法解题时常用的两个典型的解空间树

子集树


   void Backtrack(int t){//递归层次
    if(t>n)
        Output(x);
    else{
        for(int i=0;i<=1;i++){
            x[t]=i;//记录痕迹
            if(Constraint(t)&&Bound(t))
                Backtrack(t+1);
        }
    }
   }

在这想到了图的遍历的深度 优先搜索算法,对比一下

 深度优先搜索基本模型(其实和子集树模板一样)

  void dfs(int step) {
        //判断边界
        //尝试每一种可能
        for (int i=1;i<=n;i++){
            //继续下一步
            dfs(step+1);
        }
        //返回
    }

 回溯法和DFS区别联系见另一篇博客

  https://blog.csdn.net/qq_41765712/article/details/104068285

例题----01背包、图的M着色

待完善

排列树

例题---------n皇后问题

待完善...

 

 

 

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