一、递归法
import java.util.HashSet;
import java.util.Set;
public class 子集生成_递归 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= {1,2,3};
Set<Set<Integer>> set=sub(a,a.length,a.length-1);
System.out.println(set);
}
//n是数组长度
//cur是数组下标
static Set<Set<Integer>> sub(int[] a,int n,int cur){
Set<Set<Integer>> newset=new HashSet<>() ;
//加空集和第一个
if(cur==0) {
Set<Integer> nil=new HashSet<Integer>();
Set<Integer> first=new HashSet<Integer>();;
first.add(a[0]);
newset.add(nil);
newset.add(first);
return newset;
}
Set<Set<Integer>> oldset=sub(a,n,cur-1);
for(Set<Integer> set:oldset) {
//不加
newset.add(set);
//加
@SuppressWarnings("unchecked")
Set<Integer> clone=(Set<Integer>) ((HashSet<Integer>)set).clone();
clone.add(a[cur]);
newset.add(clone);
}
return newset;
}
}
二、迭代法
import java.util.HashSet;
import java.util.Set;
public class 子集生成_迭代 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= {1,2,3};
Set<Set<Integer>> set=sub(a,a.length);
System.out.println(set);
}
//n是数组长度
//cur是数组下标
static Set<Set<Integer>> sub(int[] a,int n){
Set<Set<Integer>> res=new HashSet<>() ;
res.add(new HashSet<>());//加空
for(int i=0;i<n;i++) {
Set<Set<Integer>> newset=new HashSet<>() ;
newset.addAll(res);
for(Set<Integer> set:res) {
Set<Integer> clone=(Set<Integer>) ((HashSet<Integer>)set).clone();
clone.add(a[i]);
newset.add(clone);
}
res=newset;
}
return res;
}
}
三、二进制法
public class 子集生成_二进制 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= {1,2,3};
Set<Set<Integer>> set=sub(a,a.length);
System.out.println(set.toString());
}
//n是数组长度
//cur是数组下标
static Set<Set<Integer>> sub(int[] a,int n){
Set<Set<Integer>> res=new HashSet<>() ;
for(int i=(int) (Math.pow(2, n)-1);i>0;i--) {
Set<Integer> set=new HashSet<Integer>();
for(int j=n-1;j>=0;j--) {
if(((i >> j) & 1)==1) {
set.add(a[j]);
}
}
res.add(set);
}
return res;
}
}