回溯法——基于DFS的思想
来源:互联网 发布:windows优化大师64位 编辑:程序博客网 时间:2024/06/05 10:18
1. 背景
有时会遇到这样一类题目,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。
回溯法的优点在于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。
但是,对于可以得出明显的递推公式迭代求解的问题,还是不要用回溯法,因为它花费的时间比较长。
2. 回溯法的关键概念
回溯法中,首先需要明确下面三个概念:
- 约束函数:约束函数是根据题意定出的。通过描述合法解的一般特征用于去除不合法的解,从而避免继续搜索出这个不合法解的剩余部分。因此,约束函数是对于任何状态空间树上的节点都有效、等价的。
- 状态空间树:刚刚已经提到,状态空间树是一个对所有解的图形描述。树上的每个子节点的解都只有一个部分与父节点不同。
- 扩展节点、活结点、死结点:所谓扩展节点,就是当前正在求出它的子节点的节点,在DFS中,只允许有一个扩展节点。活结点就是通过与约束函数的对照,节点本身和其父节点均满足约束函数要求的节点;死结点反之。由此很容易知道死结点是不必求出其子节点的(没有意义)。
3. 为什么用DFS:剪枝
在回溯法中,一般都用DFS。为什么呢?这是因为可以通过约束函数杀死一些节点从而节省时间(剪枝),由于DFS是将路径逐一求出的,通过在求路径的过程中杀死节点即可省去求所有子节点所花费的时间。DFS在以这种方法解决问题时思路要清晰非常多。
4. 回溯法具体步骤
回溯法可以被认为是一个有剪枝的DFS过程,利用回溯法解题的具体步骤:
首先,要通过读题完成下面三个步骤:
- 描述解的形式,定义一个解空间,它包含问题的所有解。
- 构造状态空间树。
- 构造约束函数(用于杀死节点)。
然后就要通过DFS思想完成回溯,完整过程如下:
- 设置初始化的方案(给变量赋初值,读入已知数据等)。
- 变换方式去试探,若全部试完则转(7)。
- 判断此法是否成功(通过约束函数),不成功则转(2)。
- 试探成功则前进一步再试探。
- 正确方案还未找到则转(2)。
- 已找到一种方案则记录并打印。
- 退回一步(回溯),若未退到头则转(2)。
- 已退到头则结束或打印无解。
5. 状态空间树的数据结构
回溯法的状态空间树,在计算机上的数据结构有两种表示方法。当用k表示树的节点层数,n表示节点总数,m表示解的总数时:
- 用m个k元组表示m种不同的解。其中,每组中的元素是[1,n]中的一个元素。
- 用m个n元组表示m种不同的解。因为所有的节点都包含在每个解的表示中,每组中的元素只有两种情况,被选用和不被选用(1和0)。
这两种数据结构的解空间最多都含有2n个不同的元组。
6. 回溯法的通用程序结构
Backtracking(int a[], int k, data input) { if (is_a_solution(a, k, input)){ process_solution(a, k, input)}else{ k = k+1; construct_candidates(a, k, input, c, &numc); for(i=0; i<numc, i++) { a[k]=c[i]; Backtracking(a, k, input); }}}
0 0
- 回溯法——基于DFS的思想
- 回溯法(DFS思想)
- 回溯法的思想
- DFS(深度搜索)——基于回溯法和递归
- HDU 1181 DFS回溯思想
- 回溯法的基本思想
- 回溯法,DFS的应用
- 图的点着色、区间着色问题及其应用(基于贪心思想的DFS回溯法求点着色问题和区间着色算法求解任务调度问题)
- HDU 1016 回溯法思想做的
- ACM暑期集训——专题一[DFS回溯法]
- dfs回溯的注意事项
- 回溯法思想原理
- 回溯法基本思想
- dfs——回溯法求最短路径
- POJ1321 棋盘问题 —— DFS回溯
- DFS BFS 回溯法
- DFS与回溯法
- hdu1016-dfs回溯法
- WebView学习
- zephir-内置函数
- Java实现redis事务
- 基于 ARM系统的 IoT 停车场系统演示
- zephir-流程控制语句
- 回溯法——基于DFS的思想
- java网络编程:MulticastSocket类
- WEBRTC CAPTURE 视频采集
- spring AspectJ的Execution表达式
- zephir-php函数和异常处理
- Android记事本的开发
- cocos2dx-深度解析plist文件(二)(CCSpriteFrameCache怎么从解析出的数据创建精灵帧的)
- 远程连接SQL Server 2008,服务器端和客户端配置
- Service-黑名单来电自动挂断