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

现有一个包含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);
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-08 12:30:41

求集合元素的所有非空子集的相关文章

BC68(HD5606) 并查集+求集合元素

tree Accepts: 143 Submissions: 807 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 有一个树(nn个点, n-1n−1条边的联通图),点标号从11~nn,树的边权是00或11.求离每个点最近的点个数(包括自己). 输入描述 第一行一个数字TT,表示TT组数据. 对于每组数据,第一行是一个nn,表示点个数,接下来n-1n−1,每行三个整数u,

hdu 1856 求集合里元素的个数 输出最大的个数是多少

求集合里元素的个数 输出最大的个数是多少 Sample Input41 23 45 61 641 23 45 67 8 Sample Output42 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # include <queue> 7 # define LL

两种求集合所有子集的方法

假设我们有一个求集合的全部子集(包含集合自身)的需求,即有一个集合s,包含两个元素 <a,b>,则其全部的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素对应,数组A中的元素只有两种状态:"1"和"0",分别代表每次子集输出中集合中对应元素是否要输出,这样数组A可以看作是原集合的一个标记位图.

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

如果我们有一个求集合的所有子集(包括集合自身)的需求,即有一个集合s,包括两个元素 <a,b>,则其所有的子集为<a,ab,b>. 不难求得,子集个数sn与原集合元素个数n之间的关系为:sn=2^n-1. 本文分别讲述两种实现方法: 一:位图法: 1)构造一个和集合一样大小的数组A,分别与集合中的某个元素相应,数组A中的元素仅仅有两种状态:"1"和"0",分别代表每次子集输出中集合中相应元素是否要输出.这样数组A能够看作是原集合的一个标记位图

【Leetcode】78. Subsets(求集合的子集问题)

78. Subsets(求集合的子集问题) [分析]:求集合的所有子集问题.题目要求子集中元素非递减序排列,因此我们先要对原来的集合进行排序.原集合中每一个元素在子集中有两种状态:要么存在.要么不存在.这样构造子集的过程中每个元素就有两种选择方法:选择.不选择,因此可以构造一颗二叉树,例如对于例子中给的集合[1,2,3],构造的二叉树如下(左子树表示选择该层处理的元素,右子树不选择),最后得到的叶子节点就是子集:{ 链接 } 1 class Solution 2 { 3 private: 4 v

(c++ 实现)山东科技大学 oj 求集合的交并补集(数据结构习题)

Problem A: 求集合的交并补集 Time Limit: 1 Sec  Memory Limit: 4 MBSubmit: 3663  Solved: 1041[Submit][Status][Web Board] Description 任意给定两个包含1-30000个元素的集合A,B(集合中元素类型为任意整型数,且严格递增排列),求A交B.A并B.A-B和B-A集合. Input 输入第一行为测试数据组数.每组测试数据两行,分别为集合A.B.每行第一个数n(1<=n<=30000)为

集合元素

2407 集合元素 Time Limit : 2000/1000 MS(Java/Others) | Memory Limit :65312/32656 KB(Java/Others) Submits : 30 | Solved : 7 Description 已知集合A定义如下: (1)1属于A,2属于A: (2)若x和y都属于A则2x+3y也属于A: (3)再无其他数属于A. 试求集合A中元素从小到大排列的序列的前n项. Input 有多组测试,每组输入一个正整数n(n<=1000). Ou

求集合的子集

package com.xsz.demo; /**     * @author cwqi    * @date 2014-11-19 下午9:55:31    */ public class SubSet { /**  * 求集合的子集  * @param args  */ public static void main(String[] args) { int array[] = {1,2,3}; SubSet.getSubSet(array); } private static void g

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

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