c2java 回溯,下一个排列和子集和
来源:互联网 发布:青岛惠普大数据图片 编辑:程序博客网 时间:2024/06/05 04:30
穷举:生成所有候选解,然后找出需要的解。
回溯:把解表示成向量,每个分量取自一个有限集合。从部分解开始,每次添加解的一个分量,然后判断如果有可能扩展成完整解则递归下去,否则换成下一个。可以看做是隐式图上的深度优先搜索。
回溯/穷举的复杂度,最坏时和后者一样,通常情形因为不必遍历所有子节点,还是比较快的。
回溯框架:
backtrack(a[], k)
if a[0,...,k] is a solution
output;
else
k = k + 1;
for c: the i-th of candidates
a[k] = c;
bactrack(a, k);
剪枝
把快死的或者齐心怪状的树枝剪掉。对于搜索树来说,就是把候选范围缩小。
例1,八皇后问题: 把八个皇后放在8x8棋盘上,使得任意两个不在同一行或者同一列或者对角线上。
直接以棋盘格为编号,解空间为2^64, 以皇后为编号,64^8, 不同行,8^8, 不同列,8!。
如果在生成排列后再做检测,这就是穷举;如果在for分支前先做检测,这就是回溯剪枝了。
例2,子集和问题:从一个正整数集合中找一个子集,使得其元素和为给定的数d。
记当前部分和为s。 如果选择e, s + e > d 或者s + 剩下所有元素 < d,该分支肯定无解,应该剪掉。
回溯:把解表示成向量,每个分量取自一个有限集合。从部分解开始,每次添加解的一个分量,然后判断如果有可能扩展成完整解则递归下去,否则换成下一个。可以看做是隐式图上的深度优先搜索。
回溯/穷举的复杂度,最坏时和后者一样,通常情形因为不必遍历所有子节点,还是比较快的。
回溯框架:
backtrack(a[], k)
if a[0,...,k] is a solution
output;
else
k = k + 1;
for c: the i-th of candidates
a[k] = c;
bactrack(a, k);
剪枝
把快死的或者齐心怪状的树枝剪掉。对于搜索树来说,就是把候选范围缩小。
例1,八皇后问题: 把八个皇后放在8x8棋盘上,使得任意两个不在同一行或者同一列或者对角线上。
直接以棋盘格为编号,解空间为2^64, 以皇后为编号,64^8, 不同行,8^8, 不同列,8!。
如果在生成排列后再做检测,这就是穷举;如果在for分支前先做检测,这就是回溯剪枝了。
例2,子集和问题:从一个正整数集合中找一个子集,使得其元素和为给定的数d。
记当前部分和为s。 如果选择e, s + e > d 或者s + 剩下所有元素 < d,该分支肯定无解,应该剪掉。
只有我们在验证所有叶子都可达确认算法正确后,才可用剪枝。一开始上剪枝可能导致结果不正确,比如下面的求连续可重复子集和sumBT()。
代码:
0 0
- c2java 回溯,下一个排列和子集和
- 回溯算法:子集树和排列树
- 回溯之子集树和排列树
- 回溯法——关于子集树和排列树
- 回溯问题+幂集、排列、子集和问题、八皇后问题
- 回溯法---子集和
- 回溯法 子集和问题
- 回溯法(Backtracking)总结(子集,全排列,组合和,回文分割)
- 【回溯】子集树和排列树(装载/最大团/n皇后/旅行商)
- 子集和全排列问题
- 子集树和排列树
- 子集树和排列树
- 回溯法之子集和问题
- 回溯法2--子集和问题
- 子集和问题 回溯法求解
- 回溯算法-定和子集问题
- 回溯法之子集和问题
- 回溯法解决子集和问题
- OpenCV中关于cvGetCaptureProperty函数
- UDP端口绑定
- Maven 核心概念——插件和目标
- Linux下编译mongodb以及C++客户端驱动
- Ajax XMLHttpRequest对象 取得返回值
- c2java 回溯,下一个排列和子集和
- Maven 核心概念——生命周期
- next_permutation(自动全排列)
- php Laravel 框架之分页
- 不要光靠嘴,而是要靠实际行动
- POI导出EXCEL经典实现
- SkipList跳表
- 2014搞笑段子
- Linux用户空间与内核空间(转)