幂集的计算

求一个集合的幂集就是求一个集合的所有的子集,方法有穷举法,分治法,回溯等,这里使用回溯法。

回溯法是设计递归过程的一种重要的方法,它的求解过实质上是一个先序遍历一棵“状态树”的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中的。

幂集中的每个元素是一个集合,它或是空集,或含集合A中一个元素,或含集合A中两个元素…… 或等于集合A。反之,从集合A 的每个元素来看,它只有两种状态:它或属幂集的无素集,或不属幂集的元素集。则求幂集p(A)的元素的过程可看成是依次对集合A中元素进行“取”或“舍”的过程,并且可以用一棵二叉树来表示过程中幂集元素的状态变化过程,树中的根结点表示幂集元素的初始状态(空集);叶子结点表示它的终结状态,而第i层的分支结点,则表示已对集合A中前i-1个元素进行了取舍处理的当前状态(左分支表示取,右分支表示舍 )。因此求幂集元素的过程即为先序遍历这棵状态树的过程。

求集合A={}的幂集可以从元素的角度看,即每个元素只有两个状态,取或者不去。则求幂集的过程可以看成是依次对集合A中元素进行取或者不取操作,

并且可以用一颗树二叉树来表示。

 

#include<iostream>
using namespace std;
typedef char Elem;
void output(Elem a[],int n)
{
    for(int i=1;i<n+1;i++)
    {
        if(a[i]!=0)
        {
            cout<<a[i];
        }
    }
    cout<<endl;
}

void GetPowerSet(int i,int n,Elem a[],Elem b[])
{
    if(i>=n)
        output(b,n);
    else
    {
        Elem x=a[i];
        b[i+1]=x;
        GetPowerSet(i+1,n,a,b);
        b[i+1]=0;
        GetPowerSet(i+1,n,a,b);
    }
}

int main()
{
    Elem a[100]={‘a‘,‘b‘,‘c‘,‘d‘};
    Elem b[100];
    GetPowerSet(0,4,a,b);
    return 0;
}

时间: 2024-10-11 23:07:01

幂集的计算的相关文章

11.幂集计算[回溯递归]&lt;一&gt;

还是按照老方法,把问题最大程度的精简,现在求集合A={a,b}的幂集,只有两个元素,应该有{a,b},{a},{b},{x}四种可能.如果把这两个元素弄清楚了,其余的也都一样, 仅仅是数量增大了一些.现在用两个数组,A是原集,B存放子集.关键是约束条件,就是边界如何界定.先这样考虑,先在B集合中放入一个元素,再放入一个元素,已经不能再放了,因为A集只有两个元素,就像是手中只有两个球,都拿出去就没有了,所以这里把约束条件定为,只要拿出去的数量>=手中的数量,就返回.如图所示,这里用的是下标,所以第

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

使用R语言计算均值,方差等

R语言对于数值计算很方便,最近用到了计算方差,标准差的功能,特记录. 数据准备 height <- c(6.00, 5.92, 5.58, 5.92) 1 计算均值 mean(height) [1] 5.855 2 计算中位数 median(height) [1] 5.92 3 计算标准差 sd(height) [1] 0.1871719 4 计算方差 var(height) [1] 0.03503333 5 计算两个变量之间的相关系数 cor(height,log(height)) [1] 0

NumPy基础:数组和失量计算

NumPy : Numerical Python,是高性能科学计算和数据分析的基础包. 部分功能: ndarray:一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组: 用于对整组数据进行快速运算的标准数学函数(无需编写循环): 用于读写磁盘数据的工具以及用于操作内存映射文件的工具: 线性代数.随机数生成以及傅里叶变换功能: 用于集成C.C++.Fortran等语言编写的代码工具: 大部分数据分析应用关注的功能: 用于

MySQL计算百分比方法介绍

根据相应条件抽出相应count数(myCount) 抽出总count数(totalCount) 计算百分比:myCount / totalCount * 100 四舍五入:使用ROUND函数ROUND(number,要保留的小数位),ROUND(myCount / totalCount * 100,1) 下面给出示例供参考: SELECT ROUND(T1.co/T2.totalCo*100,1)    FROM      (SELECT COUNT(*) AS co        FROM f

也来说说关于未在本地计算机上注册“VFPOLEDB.1”的程序的解决方法

大家都知道VFP是一个非常古老的数据库.但是,还有一些单位用到这些数据库. 前段时间,也做了一个关于DBF数据导出的功能的测试.程序以前有同事写好了,但当我进行修改调试的时候,问题就出来了. 调试的时候,一切都是正常的,VFPOLEDBSetup.msi这个肯定得先安装. 但是,架设到IIS上之后,就不行了,出现未在本地计算机上注册"VFPOLEDB.1"的程序这样的错误. 由于之前也没碰过DBF文件导入导出或者操作方面的问题,所以,第一想到的是百度. 百度上面,当然有好多答案,基本上

js 小数计算为啥和想象中不一样!

今天遇到了一个比较有趣的事,如果要你计算0.1+0.2等于多少你会怎么回答? "0.3啊!"你可能都不会考虑.我也一样,当a=0.1,b=0.2时 if(a+b === 0.3){...}.我可能等一下午都等不到大括号中的内容被执行. 为啥呢?因为在js中0.1+0.2=0.30000000000000004.说起来你可能不信,又或者去验证一下.结果为啥是这样?在我查找资料之后豁然开朗.对于浮点型数据,大多语言计算都会丢失精度.但是像c++/java这种厉害的语言都有自己封装的一套方法

算法-计算阶乘n!末尾0的个数

算法逻辑转载自计算阶乘n!末尾0的个数: 问题描述    给定参数n(n为正整数),请计算n的阶乘n!末尾所含有"0"的个数.    例如,5!=120,其末尾所含有的"0"的个数为1:10!= 3628800,其末尾所含有的"0"的个数为2:20!= 2432902008176640000,其末尾所含有的"0"的个数为4. 计算公式    这里先给出其计算公式,后面给出推导过程.    令f(x)表示正整数x末尾所含有的&q

CUDA 计算线程索引的一般公式

CUDA thread index: int blockId = blockIdx.z * (gridDim.x*gridDim.y)                    + blockIdx.y * gridDim.x                    + blockIdx.x; int threadId = blockId * (blockDim.x * blockDim.y * blockDim.z)                      + threadIdx.z * (blo