回溯法总结

回溯法总结

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!)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值