含有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();
}
}