求集合元素的所有非空子集

现有一个包含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的所有整数,并转化为二进制,按以上思路输出所有子集。

具体实现如下:

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);
		}
	}
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值