求集合元素的所有非空子集
2015-08-27 22:10
232 查看
现有一个包含N个元素的集合S,求集合S的所有子集?
例如:集合S包含三个元素{a, b, c},则它的所有子集为:{ }(空集), {a}, {b}, {c}, {a, b}, {a, c}, {b, c} 和{a, b, c}。
这里先用位操作的思路来求解,具体方法:用2进制Bit位来标记集合中的某个元素是否被选中,1代表选中,0代表未选中。例如集合{a,
b, c}的所有子集可如下表示:
{a} 0 0 1
{b} 0 1 0
{c} 1 0 0
{a, b} 0 1 1
{a, c} 1 0 1
{b, c} 1 1 0
{a, b, c} 1 1 1
从上面的分析中也可以看出一个包含N个元素的集合S有(2^N)-1个非空子集,非常容易想到的方法就是遍历1~2^N-1的所有整数,并转化为二进制,按以上思路输出所有子集。
具体实现如下:
例如:集合S包含三个元素{a, b, c},则它的所有子集为:{ }(空集), {a}, {b}, {c}, {a, b}, {a, c}, {b, c} 和{a, b, c}。
这里先用位操作的思路来求解,具体方法:用2进制Bit位来标记集合中的某个元素是否被选中,1代表选中,0代表未选中。例如集合{a,
b, c}的所有子集可如下表示:
{a} 0 0 1
{b} 0 1 0
{c} 1 0 0
{a, b} 0 1 1
{a, c} 1 0 1
{b, c} 1 1 0
{a, b, c} 1 1 1
从上面的分析中也可以看出一个包含N个元素的集合S有(2^N)-1个非空子集,非常容易想到的方法就是遍历1~2^N-1的所有整数,并转化为二进制,按以上思路输出所有子集。
具体实现如下:
public class SubSet { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List<List<String>> result = new ArrayList<List<String>>();//存放所有子集 List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); list.add("5"); //获取list集合中元素的所有子集,并存入result集合中 getSubSet(list,result); for (List<String> li : result) { for (String string : li) { System.out.print(string+" "); } System.out.println(); } } private static void getSubSet(List<String> sourceSet, List<List<String>> result) { // TODO Auto-generated method stub int n = sourceSet.size(); //num个元素有2^num-1个非空子集 int num = (int) Math.pow(2, n); for (int i = 1; i < num; i++) { String binary = Integer.toBinaryString(i); int size = binary.length(); //System.out.println("size "+size); for (int k = 0; k < n-size; k++) { binary = "0"+binary; } //System.out.println("binary "+binary); List<String> set = new ArrayList<String>(); //System.out.println(binary.length()); for (int index = 0; index < sourceSet.size(); index++) { if(binary.charAt(index) == '1'){ set.add(sourceSet.get(index)); } } /*for (String string : set) { System.out.print(string+" "); } System.out.println();*/ result.add(set); } } }
相关文章推荐
- 备忘录模式
- dlopen Linux 动态库失败原因与解决办法总结
- 敏捷软件开发:原则、模式与实践——第10章 LSP:Liskov替换原则
- 阿里 Java面试 知识点
- Android学习0827<九>(Toast、AlertDialog )
- 推荐两篇文章弄清字符编码
- 有关测试常用辅助工具汇总
- nginx反向代理
- 机器学习算法基础概念总结
- bitMap算法
- 从烙铁手到IT男
- 机器学习中的相似性度量
- storm资源
- Javascript单元测试
- UVA 1391 2-SAT
- Android常用组件(Activity学习之一)
- 从键盘接收字符并输出对应大写或小写
- 决策树
- Vim练级笔记(持续更新)
- linux下automake用法