计算机算法设计与分析——回溯法
2020-02-02 14:29
1206 查看
回溯法的算法框架
1.非递归回溯框架
int x[n];//x存放解向量,全局变量 void backtrack(int n)//非递归框架 { int i = 1;//根结点层次为1 while (i >= 1)//尚未回溯到头 { if (ExistSubNode(t))//当前结点存在子结点 { for (j = 下界; j <= 上界; j++)//对于子集树,j=0到1循环 { x[i]取一个可能的值; if (constraint(i) && bound(i))//x[i]满足约束条件或界限函数 { if (x是一个可行解) 输出x; else i++;//进入下一层次 } } } else i--;//回溯:不存在子结点,返回上一层 } }
2.递归的算法框架
(1)解空间为子集树
int x[n];//x存放解向量,全局变量 void backtrack(int i)//求解子集树的递归框架 { if (i > n)//搜索到叶子结点,输出一个可行解 输出结果; else { for (j = 下界; j <= 上界; j++)//用j枚举i所有可能的路径 { x[i] = j;//产生一个可能的解分量 -//其他操作 if (constrint(i) && bound(i)) backtrack(i + 1);//满足约束条件和限界函数,继续下一层 } } }
(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 (constrint(i) && bound(i)) backtrack(i + 1);//满足约束条件和限界函数,继续下一层 swap(x[i], x[j]);//恢复状态 ...//第i层的结点选择x[j]的恢复操作 } } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 算法设计与分析第5章 回溯法(一)【回溯法】
- 计算机算法设计与分析——求解查找问题
- 0/1背包(回溯法求解)-算法设计与分析
- 计算机算法设计与分析——递归与分治策略(二)
- 算法设计与分析-回溯法
- 计算机算法设计与分析——求解棋盘覆盖问题
- 算法设计与分析第5章 回溯法(二)【回溯法应用】
- 计算机算法设计与分析——求解循环日程安排问题
- 算法设计与分析——批处理作业调度(回溯法)
- 计算机算法设计与分析——排序(递归算法)
- 算法设计与分析——符号三角形问题(回溯法)
- 算法设计与分析——普通高校本科计算机专业特色教材精选
- 计算机算法设计与分析(1)--算法概述
- 算法设计与分析——最大团问题(回溯法)
- 算法设计与分析——n后问题(回溯法+位运算)
- 算法设计与分析——回溯法算法模板
- 计算机等级考试和C语言学习
- 学计算机学生的困惑
- 优秀计算机技术书籍
- 计算机存储单位:bit, Byte, KB, MB, GB, TB, PB, EB, ZB, BB