求集合的所有子集的算法
转自: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);}}
求集合的所有子集的算法相关推荐
- 集合的所有子集的算法
转载自:http://blog.csdn.net/yzl20092856/article/details/39995085 求集合的所有子集的算法 对于任意集合A,元素个数为n(空集n=0),其所有子 ...
- Java实现构建函数依赖与函数依赖集的类、求函数依赖集的闭包、属性集闭包、判断属性集是否为候选码/超码、求集合的全部子集
求函数依赖集闭包 本文讲解具体代码实现,相关概念可查阅资料(其实我只是想把代码保存到博客上嘿嘿 这算是我第一次能够用构建一个个类来解决一个较大的问题(不再是像考试一样在一个类里写n个函数了ORZ),在 ...
- 求集合A的子集(图+案例)
求集合A的子集 1.什么是子集 2.求解子集的步骤(以123为例) 2.1代码 1.什么是子集 子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称为集合B的子集. 符号语言:若 ...
- 傻瓜方法求集合的全部子集问题(java版)
给定随意长度的一个集合.用一个数组表示,如{"a", "b","c"},求它的全部子集.结果是{ {a}, {b}, {c}, {a,b}, ...
- java set子集_Java 求集合的所有子集
packagech01;importjava.util.HashSet;importjava.util.Iterator;importjava.util.LinkedList;importjava.u ...
- 求集合的所有子集问题
给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 示例: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[ ...
- 两种求集合全部子集的方法
如果我们有一个求集合的所有子集(包括集合自身)的需求,即有一个集合s,包括两个元素 <a,b>,则其所有的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间 ...
- 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的真子集,同 ...
- 求一个集合的所有子集
题目描述 求一个集合的所有结合,例如集合{A,B,C}的所有子集为:{},{A,B,C},{A,B},{A,C},{B,C},{A},{B},{C}. 思路 实际上求子集问题是一个经典的DFS,每一次 ...
最新文章
- c语言用随机数定义数组中,C语言 将发生的随机数存入数组,数据不能相同
- Ubantu-16.04 eclipse安装
- C语言sprintf与sscanf函数
- android人脸识别技术浅析
- .NET Core VS Code 环境配置
- int** 赋值_一篇文章搞明白Integer、new Integer() 和 int 的概念与区别
- 【CS229】多变量线性回归
- cuda对应pytorh安装
- WORD中使用类似苹果手机的字体Lucida Sans
- c语言答辩ppt案例,c语言ppt例子课题了答辩ppt成品中南民族大学.ppt
- DXGI抓屏优化扩展:鼠标功能+数据获取+多显示器捕获(屏幕共享源码)
- 如何对比评价TOM邮箱、QQ邮箱,Gmail邮箱以及139邮箱?
- 每天1分钟 经济学小知识
- vue——动态吸顶组件
- imageview显示服务器图片,imageview 直接加载图片流
- 有效的数独 C++算法 leetcode36
- android系统 视频流录像,Android端海康视频取流,可以实时预览与查看历史录像
- nyoj 1238 最少换乘(spfa)
- MFC 进度条使用方法
- 新手入门2:Lowpoly 宝剑