算法复习——回溯法重点问题

本文深入探讨了回溯算法的基本概念,包括其系统性和跳跃性特点,以及常用的剪枝函数——约束函数和限界函数。文章介绍了回溯算法在解向量约束问题中的应用,并详细阐述了解的构造过程。此外,还重点讨论了一类经典问题——子集和问题,分析了如何利用回溯法解决该问题并给出了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

回溯算法是具有限界函数深度优先搜索。具有系统性、跳跃性。

常用的两种剪枝函数约束函数、限界函数

解的表现形式
一般回溯算法,可以作为一种系统的搜索方法应用到一类搜索问题当中,这类问题的解由满足事先定义好的某个约束的向量(x1, x2, . . . , xi)组成。这里i是0到n之间的某个整数,其中n是一个取决于问题阐述的常量。在已经提到的两种算法—-3着色和8皇后问题中,i是固定不变的。

基本思想

在回溯法中,解向量中每个xi都属于一个有限的线序集Xi; 因此,回溯算法按词典序考虑笛卡儿积X1×X2 × … × Xn的元素。

算法最初从空向量开始,然后选择X1中最小元素作为x1 ,如果(x1)是一个部分解,算法通过从X2中选择最小的元素作为x2 继续,如果(x1,x2)是一个部分解,那么就包括X3中最小的元素。

一般地,假定算法已经检测到部分解为(x1,x2,…,xj),它然后再去考虑向量v=(x1,x2,…,xj,xj+1)。我们有下面的情况:

1、如果v表示问题的最后解,算法记录下它作为一个解,在仅希望获得一个解时终止或者继续去找出其他解。
2、(向前步骤)。如果v表示一个部分解,算法通过选择集合Xj+2中的最小元素向前。
3、如果v既不是最终的解,也不是部分解,则有两种子情况:
如果从集合Xj+1中还有其他的元素可选择,算法将xj+1置为Xj+1中的下一个
(回溯步骤)。
(1)如果从集合Xj+1中没有更多的元素可选择,算法通过将xj置为Xj中的下一个元素回溯;
(2)如果从集合Xj中仍然没有其他的元素可以选择,算法通过将xj-1置为Xj-1中的下一个元素回溯,依次类推。

必背公式

输入:集合X1,X2,…,Xn.的清楚的或隐含的描述。
输出:解向量v=(x1,x2,…,xi), 0 <= i <= n.
	1.v<-()
	2.flag<-false
	3.advance(1)
	4.if flag then output v
	5.else output “no solution”

过程 advance(k)
	1.for each x ∈Xk
	2.	xk<-x; 将 xk 加入 v
	3.	if v为最终解then set flag<-true and exit
	4.	else if v是部分解then advance(k+1)
	5. end for


输入:集合X1,X2,…,Xn.的清楚的或隐含的描述。
输出:解向量v=(x1,x2,…,xi), 0 <=i <= n.
	1.v<-()
	2.flag<-false
	3.k<-1
	4.while k >=1
	5.	while Xk没有被穷举
	6.		xk<-Xk中的下一个元素;将 xk 加入 v
	7.		if v 为最终解then set flag<-true
		    			且两个while循环退出
	8	    		else  if v 是部分解 then 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值