java求集合的子集算法

【转自】http://blog.163.com/xiaohui_1123@126/blog/static/3980524020109784356915/

思路:假设集合S(A,B,C,D),其大小为4,拥有2的4次方个子集,即0-15,二进制表示为0000,0001,...,1111。对应的子集为空集,{D},...,{A,B,C,D}。


步骤:1,求出从0到集合子集数目之间的数的二进制形式
           2,根据求的二进制形式,把集合中在二进制字符串中对应数字为的1的元素取出来,为一个子集。

例子:求集合S(A,B,C,D)的全部子集
public class MySet
{
public static void main(String[] args)
{
TreeSet<String> set = new TreeSet<String> ();
set.add("A");
set.add("B");
set.add("C");
set.add("D");
ArrayList<TreeSet<String>> subset = getSubset(set);
System.out.println("一共有" + subset.size() + "个子集。");
for(TreeSet<String> ts : subset)
{
System.out.println(ts.toString());
}
}

//求出从0到集合子集数目(这里为16)之间的数的二进制形式,存放在数组result中
public static String[] getBinaryValue(TreeSet<String> set)
{
int size = set.size();
int m = (int)Math.pow(2,size) - 1;
String[] result = new String[m+1];
      for(int i=m;i>-1;i--)
{
StringBuffer sb = new StringBuffer(Integer.toBinaryString(i));
int length = sb.length();
                        if(length < size)
{
for(int j=0;j<size-length;j++){sb.insert(0, "0");}
}
result[i] = sb.toString();
}
return result;
}

//根据二进制字符串生成子集
public static ArrayList<TreeSet<String>> getSubset(TreeSet<String> set)
{
ArrayList<TreeSet<String>> result = new ArrayList<TreeSet<String>> ();

//把集合元素放入数组中,方便存取
String[] items = new String[set.size()];
int i = 0;
for(String item : set)
{
items[i++] = item;
}
                //调用二进制字符串生成函数
String[] binaryValue = getBinaryValue(set);
//根据二进制字符串取集合元素构成子集
for(int j=0;j<binaryValue.length;j++)
{
String value = binaryValue[j];
TreeSet<String> subset = new TreeSet<String> ();
for(int k=0;k<value.length();k++)
{
if(value.charAt(k) == '1') subset.add(items[k]);
}
result.add(subset);
}

return result;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值