子集树与排列树

来源:互联网 发布:淘宝企业店铺开店装修 编辑:程序博客网 时间:2024/06/01 20:14

在前面的利用回溯法求解01背包问题的时候,我们提到了这个问题的解空间树是子集树,那么什么是子集树呢?与子集树对应的还有一个排列树!它们又有什么区别呢?

概念说明

为了说明这两个概念的区别,我们首先假定有一个集合S

当我们求解的结果是集合S的某一子集的时候,其对应的解空间是子集树。时间复杂度O(2n)

子集树

当我们求解的结果是集合S的元素的某一种排列的时候,其对应的解空间就是排列树。时间复杂度O(n!)

排列树

解空间为排列树的典型问题就是旅行售货员问题。

简要说明啥是旅行售货员问题,用图论的术语来说就是:

在一个正权的完全图中寻找一个具有最小权的哈密顿回路(由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。)。

这样就很明确了,我们要寻找的就是所有点集的一个排列(所有点都需要经过且只经过一次)。

算法描述

子集树:

void Backtrack(int t) {     //t 表示当前是树的第t层,即对集合 S 中的第 t 个元素进行判断    if (t > n)        output(x);          //大于S中总的元素个数 ,遍历完成     else        for (int i = 0; i < = l; i++) {     // 两种可能 加入或者不加入到解集合             x[t] = i;            if (Constraint(t) && Bound(t)){     //满足约数条件                      Backtrack(t + 1);           //对 t+1 层进行判断                 }         }}

排列树:

void Backtrack(int t) {     //t 表示集合 S 的第 t 个元素     if (t > n)        output(x);    else        for (int i = t; i <= n; i++) {      //第t 个元素与其后面的所有元素进行交换位置             swap(x[t], x[i]);            if (constraint(t) && bound(t)){                     backtrack(t + 1);                }             swap(x[t], x[i]);        }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出国忘了带护照怎么办 雅漾喷雾失压了怎么办 洗衣服时衣服粘上卫生纸怎么办 一晚上卫生巾都是满的怎么办 宝宝头上痱子痒怎么办 短裤里的宽松紧带拧了怎么办 肉色内衣被染黑色了怎么办 安全裤总往上缩怎么办 夏天穿裙子膝盖怕凉怎么办 夏天穿裙子膝盖冷怎么办 天凉嗓子痒咳嗽怎么办 棉服里面跑毛怎么办 棉衣里面的棉一块一块的怎么办 穿姨妈巾悟出痱子怎么办 穿裙子上衣太长了怎么办 微信封号了零钱怎么办 快递加盟商欠我工资怎么办 加盟费交了以后怎么办 加盟总部违约加盟商该怎么办 自行车锁钥匙丢了怎么办 假体隆胸肿胀痛怎么办 恶露60天不干净怎么办 剖腹产俩月恶露不干净怎么办 剖腹产恶露一个多月还没干净怎么办 小月子全身流虚汗怎么办 生完孩子严重便秘怎么办啊 产后第5天恶露少怎么办 有恶露排不出来怎么办 刚生完小孩便秘怎么办 产后15天有鲜血怎么办 恶露未净同房了怎么办 药流2月恶露不尽怎么办 生完孩子小腹痛怎么办 月子里恶露有异味怎么办 恶露干净了有异味怎么办 顺产后恶露白色异味怎么办 产妇排出的恶露有异味怎么办 恶露有股腥臭味怎么办 生完孩子下面有异味怎么办 销售货物开票税率错了怎么办 8h床垫有橡胶味怎么办