zoukankan      html  css  js  c++  java
  • 子集树和排列树

    假设现在有一列数a[0],a[1], ...a[n-1]

    ①如果一个问题的解的长度不是固定的,并且解和元素顺序无关,即可以从中选择0个或多个,那么解空间的个数将是指数级别的,为2^n,可以用下面的子集树来表示所有的解

     子集树的算法框架为:

    void backtrack(int t) {//表示访问到第t层,t从0开始  
    if (t == n)
     output(x);  
    else  
    for (int i = 0; i <= n; i++) { //表示选或不选a[t]  
      x[t] = i;  
      if (constraint(t) && bound(t))  
       backtrack(t + 1);  
     }  
    }
    

    ②如果解空间是由n个元素的排列形成,也就是说n个元素的每一个排列都是解空间中的一个元素,那么,最后解空间的组织形式是排列树

     排列树算法的基本框架为:

     

    void backtrack(int t)  
    {  
        if (t == n)  
            output(x);  
        else  
            for (int i = t; i < n; i++)  
            {  
                swap(x[t], x[i]);                    1
                if (constraint(t) && bound(t))  
                {  
                    backtrack(t + 1);                2 
                    swap(x[t], x[i]);                3  
                }  
            }  
    }  
    

    遇到子集树和排列数的回溯问题,几乎都可以用上面的模板来套。

    注意: 序列A表示“前缀”序列,以便输出,S表示需要进行全排列的元素集合,以便依次选做第一个元素。

    void print_emu(序列 A, 集合S) {  
      if (序列A满了) 输出序列A;  
     else {  
      1.按照从小到大依次考虑S中的每一个元素v  
      2.print_emu(在A的末尾加上v后得到新的序列, S-{v})  
     }  
    }  
    

    以n=3 为例说明递归的执行过程:初始化x[]={1,2,3}

    开始时:t=1,n=3;

      进入Backtrack(1) 此时t=1,i=1,执行①此时x[1]=1与x[1]=1交换;

      然后执行②进入t=1,i=1 的Backtrack(2)执行t=2,i=2的①x[2]=2与x[2]=2交换;

      然后执行②进入t=2,i=2的Backtrack(3)执行t=3,i=3的①x[3]=3与x[3]=3交换;

      然后执行②进入Backtrack(4)输出x序列(1,2,3)。

      返回到Backtrack(3)层执行t=3,i=3的③x[3]=3与x[3]=3(即还原成原序列),返回到t=2,i=2的Backtrack(2)层执行③x[2]=2与x[2]=2交换,至此t=2,i=2执行完成。

      下面开始执行t=2,i=3执行①此时x[2]=2与x[3]=3交换;

      然后执行②进入t=2,i=3的Backtrack(3)执行t=3,i=3 的①x[3]=3与x[3]=3交换;

      然后执行②进入Backtrack(4)输出x序列(1,3,2)。

      返回到Backtrack(3)层执行t=3,i=3的③x[3]=3与x[3]=3(即还原成原序列1,3,2),返回到t=2,i=2的Backtrack(2)层执行③x[2]=3与x[3]=2(即还原成原序列1,2,3)交换,至此t=2,i=3执行完成。

    至此t=1,i=1执行完成,

        下面关于执行t=1,i=2和t=1,i=3的过程与t=1,i=1类似。

     

  • 相关阅读:
    禅道使用-升级
    Maven 的这 7 个问题你思考过没有?
    https及证书
    Linux下查看/管理当前登录用户及用户操作历史记录
    禅道的安装
    Linux添加/删除用户和用户组
    Spring注解@Component、@Repository、@Service、@Controller区别 .
    myeclipse,eclipse打开当前文件所在文件夹
    java开发常用工具
    Django环境搭建之安装mod_wsgi模块
  • 原文地址:https://www.cnblogs.com/boyangx/p/4149046.html
Copyright © 2011-2022 走看看