求一个集合的所有子集(二进制实现)

原创 2015年07月09日 20:05:40

含有n个元素的集合具有2^n个子集,可以使用具有n位的二进制数来表示其中的某一个子集。如集合{a,b,c,d} ,可以使用1000 表示子集{a} , 1001 表示子集{a,d}。n位的二进制刚好有2^n个数。由于int型只有32位,所以只能表示具有32个元素的子集。以下用int数组来表示一个大数,使用大数来表示子集。

public class BigDataZiJiHe {
    int[] b;
    int[] a;
    BufferedWriter out;
    BigDataZiJiHe(int[] b,String file) throws IOException{
        this.b = b; 
        a = new int[(b.length)/32 +1];
        out=new BufferedWriter(new FileWriter(file));
    }

    public boolean inc(){//对大数a 进行加1 操作,当大数溢出时,返回true

        int flag = 0;
        boolean isOver = false;

        for(int i = 0;i<a.length;i++){
          if(i==0){
              if(a[i]<Integer.MAX_VALUE){
                  a[i] = a[i]+1;
              }else{
                  a[i] = 0;
                  flag = 1;
              }
          }else{
              if(a[i]<Integer.MAX_VALUE){
                  a[i] = a[i]+flag;
                  flag = 0;
              }else{
                  a[i] = 0;
                  flag = 1;
              } 
          }

        }
        int n = b.length;
        int k = n/32;
        int m = n%32;
        if((a[k] & 1<<m) != 0){//判断是否超出的此大数的表示范围,大数范围{1 到  b.length个二进制1表示的 数}
            isOver = true;
        }
        return isOver;

    }

    public void fun() throws IOException{
        while(!inc()){
            for(int j = 0;j<b.length;j++){//查看第j个元素是否在当前的a[] 中。 对于一个子集,查看各个位的元素
                int k = j/32;
                int m = j%32;
                if((a[k] & (1<<m))!= 0){
                    out.write(b[j]+" ");

                }
            }

            out.newLine();
        }
        out.close();
    }

    public static void main(String[] args) throws IOException {
        int[] b = new int[65];
        for(int i = 0;i<b.length;i++){
            b[i] = i;
        }
        BigDataZiJiHe obj = new BigDataZiJiHe(b,"d:/result.txt");
        obj.fun();


    }

}

从零开始实现一个可用的mvc框架

-
  • 1970年01月01日 08:00

一个集合的所有子集

 一个集合的所有子集: (一)输出一个集合的所有子集: (二)思想: 一个大小为n的集合,它的所有子集的个数为2^n,即一个n位的二进制数,其中每一个位可以为1,也可以为0,如果为1,表示...
  • legend050709
  • legend050709
  • 2014-09-14 16:32:35
  • 988

求集合的所有子集的算法

求集合的所有子集的算法对于任意集合A,元素个数为n(空集n=0),其所有子集的个数为2^n个如集合A={a,b,c},其子集个数为8;对于任意一个元素,在每个子集中,要么存在,要么不存在,对应关系是:...
  • yzl20092856
  • yzl20092856
  • 2014-10-11 15:30:14
  • 2703

求集合的所有子集(java实现)

代码: import java.io.File; import java.io.FileWriter; import java.io.IOException; /* *Created on 201...
  • caiandyong
  • caiandyong
  • 2015-01-31 22:08:20
  • 1320

位运算之求集合的所有子集

[置顶] 给力!简单!易懂!位运算之求集合的所有子集 分类: 结构/算法 c/c++刁钻问题各个击破2011-08-03 17:38 3130人阅读 评论(5) 收藏 举报 c数据结构测试算法...
  • yuyanggo
  • yuyanggo
  • 2015-08-10 12:47:58
  • 916

求一个集合的所有子集问题

一个包含n个元素的集合,求它的所有子集。这种问题一般有两种思路,先说说第一种,递归。递归肯定要基于一个归纳法的思想。...
  • pony_maggie
  • pony_maggie
  • 2014-06-15 21:44:56
  • 18900

递归求集合的所有子集的程序

#include #include using namespace std; //算法描述: //1、如果遍历完全集,打印出所有被标记为true的元素 //2、否则: //3、取第de...
  • woaifen3344
  • woaifen3344
  • 2012-04-25 13:01:48
  • 3498

输出一个集合的所有子集合-Java代码实现(二)

接上篇,提供另外一种解题s
  • foreverbu
  • foreverbu
  • 2014-07-08 16:39:16
  • 6147

使用递归求出一个集合的所有子集

想一下,平时如果给你1,2,3,4四个数,让你写出它的所有子集,你会怎么做? 我想大部分人的思路是先写出子集中只含有一个元素的子集:1;2;3;4。然后考虑子集中含有两个元素的子集:1,2;1,3;...
  • nkuhjp
  • nkuhjp
  • 2016-09-21 21:05:46
  • 4476

求一个集合所有子集的Python实现

收集整理求一个集合的所有子集的Python实现方法,以供大家参考。
  • tszw1007
  • tszw1007
  • 2017-09-06 20:39:56
  • 2752
收藏助手
不良信息举报
您举报文章:求一个集合的所有子集(二进制实现)
举报原因:
原因补充:

(最多只允许输入30个字)