一个集合的所有子集等于2^该集合的长度。比如{c,b,a}的长度为3,这个集合的子集就有8个。
这句话看起来很简单,但同时也隐含着高深的哲理。其实一个集合的所有集合,和2^该集合的长度这个数字有关。比如上面的例子,{c,b,a}的长度为3,则可以用0-7表示其所有子集。如下所示,改数字所对应的位置为1,则说明我需要这个数字形成子集。从0-7的二进制表示,刚好代表完,一个长度为3,子集个数为8的所有子集。
0(000):{}
1(001):{a}
2(010):{b}
3(011):{ab}
4(100):{c}
5(101):{a,c}
6(110):{b,c}
7(111):{a,b,c}
进行一个2^n的循环,比如 当取i=3时 3&1为1,所以把a加进去,然后3进行右移一位为1,1&1为1,所以把b加进去,然后1右移一位为0,循环结束。把ab添加到list中
import java.util.ArrayList;
public class 子集 {
public static void main(String[] args) {
// TODO Auto-generated method stub
子集 zi=new 子集 ();
int a[]={1,2,3,4};
zi.search(a);
}
void search(int a[]){
int len=1<<a.length;
ArrayList<String> list=new ArrayList<String>();
for(int i=0;i<len;i++){//len是2的n次方
int j=i;
String s="";
int k=0;
while(j>0){//j>0 k<a.length
if((j&1)==1)
s+=a[k];
k++;
j=j>>1;
}
list.add(s);
}
for(String ss:list)
System.out.println(ss );
}
}