两种典型的解空间树:子集树和排列树

(1)定义

子集树:所给问题是从N个元素的集合中找出满足某种性质的子集时,相应的解空间树,称为子集树。子集树通常有2^n个叶节点,遍历子集树的任何算法都需要O(2^n)的计算时间。

例如:0-1背包问题的解空间树为一棵子集树。

排列树:当所给的问题是确定N个元素满足某种性质的排列时,相应的解空间称为排列树,排列树通常有N!个叶节点,因此,遍历排列树需要N!的计算时间。

例如:旅行售货员问题的解空间树为一棵排列树。

(2)回溯法遍历实现

1.搜索子集树

1 void backtrack (int t)
2 {
3   if (t>n) output(x);
4   else
5       for (int i=0;i<=1;i++) {
6           x[t]=i;
7           if (legal(t)) backtrack(t+1);
8       }
9 }

2.搜索排列树

 1 void backtrack (int t)
 2 {
 3   if (t>n) output(x);
 4   else
 5       for (int i=t;i<=n;i++) {
 6           swap(x[t], x[i]);
 7           if (legal(t)) backtrack(t+1);
 8           swap(x[t], x[i]);//回溯还原
 9       }
10 } //调用函数回溯

原文地址:https://www.cnblogs.com/mainull/p/10338984.html

时间: 2024-10-11 07:36:29

两种典型的解空间树:子集树和排列树的相关文章

C/C++实现快速排序的两种典型代码

快速排序由C. A. R. Hoare在1960年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 第一种典型实现:通过两个游标来遍历整个待排序数组,i指向数组的第一个元素,j指向数组的最后一个元素.先取出数组中的一个数arr[i],将其保存在key中,此时arr[i]空出来了,这时游标j往前移,就可找到大于等于key的数,

链圈的朋友们值得收藏!腾讯首席架构师教你两种区块链设计思路

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由敖萌发表于云+社区专栏 区块链发展到了现在,产生了很多不同形式的区块链技术.随着技术的发展,目前比较公认的看法是区块链已经走进了2.0时代.区块链1.0是以比特币为代表的去中心化数字货币区块链系统,而2.0则是引入了智能合约的区块链系统. 在支持智能合约的区块链系统中,Linux基金会所属的Hyperledger Fabric(由IBM贡献)和Vitalik Buterin所领导的以太坊基金会所创造并管理的Ethereum(以太坊

树:最小生成树-两种算法

先来说说什么是树. 树实际上是图的一种,当一个有N个点的无向连通图,只有N-1条边时,就是一棵树,即树中不会有环出现:所以对于一个图,删除某些环中的某条边,使得该图成为一棵树,那么这棵树就称为生成树. 而最小生成树的意思就是,给定有n个顶点的带权图G(E,V),找到一棵生成树,求该生成树的边权和. Kruskal算法: 算法步骤: 1.构造一个有n个顶点的无边子图: 2.从原图选择边权最小的边加入该子图,直至子图成为一棵树: 3.边能加入子图的条件是,边的两个端点u,v还未连通,Kruskal算

hdu1828 Picture(线段树+离散化+扫描线)两种方法

C - Picture Time Limit:2000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Description A number of rectangular posters, photographs and other pictures of the same shape are pasted on a wall. Their sides are all vertical or

二元查找树的翻转(镜像)的两种思路

问题描述: 输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点. 算法: 测试用例: 10 /             \ 5               11 /        \ 3            7 /     \         /   \ 2       4     6      9 /                       / 1                       8 算法: 有两种思路: ①递归.对树翻转,只

15.输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点, 用递归和循环两种方法完成树的镜像转换

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4260432.html  声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点, 用递归和循环两种方法完成树的镜像转换. 题目分析:

POJ 1849 Two (树形dp 树的直径 两种方法)

Two Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1232   Accepted: 619 Description The city consists of intersections and streets that connect them. Heavy snow covered the city so the mayor Milan gave to the winter-service a list of st

Count on a tree SPOJ 主席树+LCA(树链剖分实现)(两种存图方式)

Count on a tree SPOJ 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)[GO!] 题意 是说有棵树,每个节点上都有一个值,然后让你求从一个节点到另一个节点的最短路上第k小的值是多少. 解题思路 看到这个题一想以为是树链剖分+主席树,后来写着写着发现不对,因为树链剖分我们分成了一小段一小段,这些小段不能合并起来求第k小,所以这个想法不对.奈何不会做,查了查题解,需要用LCA(最近公共祖先),然后根据主席树具有区间加减的性质,我们

codevs 2216 线段树 两种更新方式的冲突

题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可不仅学到了丰富的宇航知识,还参与解决了一些模拟飞行中发现的问题,今天指导老师交给他一个任务,在这次模拟飞行的路线上有N个行星,暂且称它们为一个行星序列,并将他们从1至n标号,在宇宙未知力量的作用下这N个行星的质量是不断变化的,所以他们对飞船产生的引力也会不断变化,小可可的任务就是在飞行途中计算这个行星序列中某段行星的质量和,以便能及时