当前位置 博文首页 > m0_53521757的博客:回溯法总结

    m0_53521757的博客:回溯法总结

    作者:[db:作者] 时间:2021-07-15 15:34

    回溯法总结

    1.回溯法有“通用解题法”之称,它可以系统地搜索一个问题的所有解或任意解。

    2.回溯法是一种既带系统性又带有跳跃性的搜索算法。

    3.回溯算法在生成解空间的任一结点时,先判断该结点是否可能包含问题的解,如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向祖先结点回溯。

    4.通常以深度优先方式系统搜索问题解

    5.解空间树有两种。子集树和排列数

    6.搜索解空间树时,常用的两种剪枝函数为:约束函数和限界函数

    递归回溯框架

    1.解空间为子集树

    int x[n];                //x存放解空间,为全局变量
    void backtrack(int i)    //求解子集树的递归框架
    {
    	if(i>n)             //搜索到叶子结点,输出一个可行解
    		输出结果;     
    	else
    	{
    		for(j=下界;j<=上界;j++) //用j枚举i所有可能的路径
    		{
    			x[i]=j;     //产生一个可能的解分量
    			……        //其他操作
    			if(constraint(i)&&bound(i))
    				backrack(i+1);    //满足约束条件和限界函数,继续下一层
    		}
    	}
    }
    

    时间复杂度为O(2^n)

    2.解空间为排列树

    int x[n];                //x存放解空间,并初始化
    void backtrack(int i)    //求解排列树的递归框架
    {
    	if(i>n)             //搜索到叶子结点,输出一个可行解
    		输出结果;     
    	else
    	{
    		for(j=i;j<=n;j++) //用j枚举i所有可能的路径
    		{
    			……         //第i层的结点选择x[j]的操作
    			swap(x[i],x[j]); //为保证排列中的每个元素不同,通过交换来实现
    			if(constraint(i)&&bound(i))
    				backrack(i+1);    //满足约束条件和限界函数,继续下一层
    			swap(x[i],x[j]);  //恢复状态
    			……           //第i层的结点选择x[j]的恢复操作
    		}
    	}
    }
    

    时间复杂度为O(n!)

    cs
    下一篇:没有了