转自:http://plutoblog.iteye.com/blog/976218

求集合的所有子集的算法

对于任意集合A,元素个数为n(空集n=0),其所有子集的个数为2^n个

如集合A={a,b,c},其子集个数为8;对于任意一个元素,在每个子集中,

要么存在,要么不存在,对应关系是:

a->1或a->0

b->1或b->0

c->1或c->0

映射为子集:

(a,b,c)

(1,1,1)->(a,b,c)

(1,1,0)->(a,b   )

(1,0,1)->(a,   c)

(1,0,0)->(a      )

(0,1,1)->(   b,c)

(0,1,0)->(   b   )

(0,0,1)->(      c)

(0,0,0)->@ (@表示空集)

算法(1):

观察以上规律,与计算机中数据存储方式相似,故可以通过一个整型数(int)与

集合映射000...000 ~ 111...111(0表示有,1表示无,反之亦可),通过该整型数

逐次增1可遍历获取所有的数,即获取集合的相应子集。

在这里提一下,使用这种方式映射集合,在进行集合运算时,相当简便,如

交运算对应按位与&,{a,b,c}交{a,b}得{a,b}<--->111&110==110

并运算对应按位或|,

差运算对应&~。

算法(2):

设函数f(n)=2^n (n>=0),有如下递推关系f(n)=2*f(n-1)=2*(2*f(n-2))

由此可知,求集合子集的算法可以用递归的方式实现,对于每个元素用一个映射列表marks,标记其

在子集中的有无

很显然,在集合元素个数少的情况下,算法(1)优于算法(2),因为只需通过加法运算,便能映射

出子集,而算法(2)要递归调用函数,速度稍慢。但算法(1)有一个严重缺陷,集合的个数不能大于在

计算机中一个整型数的位数,一般计算机中整型数的为32位。对于算法(2)就没这样限制。

-----------------------------------------------------------------------------------------

算法(1,取低位到高位码段作为映射列表

template<class T>void print(T a[],int mark,int length){bool allZero=true;int limit=1<<length;for(int i=0;i<length;++i){if(((1<<i)&mark)!=0)       //mark第i+1位为1,表示取该元素{allZero=false;cout<<a[i]<<" ";}}if(allZero==true){cout<<"@";}cout<<endl;}template<class T>void subset(T a[],int length){if(length>31) return;int lowFlag=0;                  //对应000...000int highFlag=(1<<length)-1;     //对应111...111for(int i=lowFlag;i<=highFlag;++i){print(a,i,length);}}

-----------------------------------------------------------------------------------------

算法(2)

template<class T>void print(T a[],bool marks[],int length){bool allFalse=true;for(int i=0;i<length;++i){if(marks[i]==true){allfalse=false;cout<<a[i]<<"  ";}}if(allFalse==true){cout<<"@";}cout<<endl;}template<class T>void subset(T a[],bool marks[],int m,int n,int length){if(m>n){print(a,marks,length);}else{marks[m]=true;subset(a,marks,m+1,n,length);marks[m]=false;subset(a,marks,m+1,n,length);}}

求集合的所有子集的算法相关推荐

  1. 集合的所有子集的算法

    转载自:http://blog.csdn.net/yzl20092856/article/details/39995085 求集合的所有子集的算法 对于任意集合A,元素个数为n(空集n=0),其所有子 ...

  2. Java实现构建函数依赖与函数依赖集的类、求函数依赖集的闭包、属性集闭包、判断属性集是否为候选码/超码、求集合的全部子集

    求函数依赖集闭包 本文讲解具体代码实现,相关概念可查阅资料(其实我只是想把代码保存到博客上嘿嘿 这算是我第一次能够用构建一个个类来解决一个较大的问题(不再是像考试一样在一个类里写n个函数了ORZ),在 ...

  3. 求集合A的子集(图+案例)

    求集合A的子集 1.什么是子集 2.求解子集的步骤(以123为例) 2.1代码 1.什么是子集 子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集. 符号语言:若 ...

  4. 傻瓜方法求集合的全部子集问题(java版)

    给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...

  5. java set子集_Java 求集合的所有子集

    packagech01;importjava.util.HashSet;importjava.util.Iterator;importjava.util.LinkedList;importjava.u ...

  6. 求集合的所有子集问题

    给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 示例: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[ ...

  7. 两种求集合全部子集的方法

    如果我们有一个求集合的所有子集(包括集合自身)的需求,即有一个集合s,包括两个元素 <a,b>,则其所有的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间 ...

  8. java 求集合真子集_【同步练习】高一高中数学必修1集合的关系与元素性质

    一.选择题(每小题2分,共30分) 1.若{1,2,3}A ⊆{1,2,3,4,5},则集合A的个数为(    ) A.2B.3C.4D.5 正确答案 B 解析 集合{1,2,3}是集合A的真子集,同 ...

  9. 求一个集合的所有子集

    题目描述 求一个集合的所有结合,例如集合{A,B,C}的所有子集为:{},{A,B,C},{A,B},{A,C},{B,C},{A},{B},{C}. 思路 实际上求子集问题是一个经典的DFS,每一次 ...

最新文章

  1. c语言用随机数定义数组中,C语言 将发生的随机数存入数组,数据不能相同
  2. Ubantu-16.04 eclipse安装
  3. C语言sprintf与sscanf函数
  4. android人脸识别技术浅析
  5. .NET Core VS Code 环境配置
  6. int** 赋值_一篇文章搞明白Integer、new Integer() 和 int 的概念与区别
  7. 【CS229】多变量线性回归
  8. cuda对应pytorh安装
  9. WORD中使用类似苹果手机的字体Lucida Sans
  10. c语言答辩ppt案例,c语言ppt例子课题了答辩ppt成品中南民族大学.ppt
  11. DXGI抓屏优化扩展:鼠标功能+数据获取+多显示器捕获(屏幕共享源码)
  12. 如何对比评价TOM邮箱、QQ邮箱,Gmail邮箱以及139邮箱?
  13. 每天1分钟 经济学小知识
  14. vue——动态吸顶组件
  15. imageview显示服务器图片,imageview 直接加载图片流
  16. 有效的数独 C++算法 leetcode36
  17. android系统 视频流录像,Android端海康视频取流,可以实时预览与查看历史录像
  18. nyoj 1238 最少换乘(spfa)
  19. MFC 进度条使用方法
  20. 新手入门2:Lowpoly 宝剑

热门文章

  1. 紫光云数(新华三)面试经历(垃圾)
  2. TensorFlow入门(十-I)tfrecord 固定维度数据读写
  3. 【实战项目】---P2P下载器
  4. 这就是你日日夜夜想要的docker!!!---------Docker Compose容器编排理论+实操
  5. 圣诞节文案,C语言画一个 blingbling 的圣诞树
  6. 超详细基于MATLAB的人脸考勤识别系统
  7. XCZU19EG板卡设计资料:610-基于6U VPX 的FPGA XCZU19EG存储阵列
  8. android telephony概述
  9. 移相全桥变换器参数设计
  10. 轻松从Word复制身份证号码粘贴到Excel