为了获得列表的幂集,我实现了以下内容:
public static ArrayList<ArrayList<Integer>> getAllSubsets(ArrayList<Integer> set, int index, ArrayList<Integer> subset){
ArrayList<ArrayList<Integer>> subsets = new ArrayList<ArrayList<Integer>>();
if(index == set.size()){
subsets.add(new ArrayList<Integer>(subset));
return subsets;
}
subsets.addAll(getAllSubsets(set, index + 1, subset));
subset.add(set.get(index));
subsets.addAll(getAllSubsets(set, index + 1, subset));
subset.remove(subset.size()-1);
return subsets;
}
这是使用递归获取列表幂集的最佳方法吗?我已经看到了很多关于如何在互联网上实现这一点的不同方法,但它们似乎比我的复制(使用新的)更多。
例如,这个StackOverlow 帖子出现在我的 Google 搜索中,但他的实现 (Joao Silva) 使用了大量的复制,并且似乎不是最佳的。但是,我经常看到他的实现,这让我很困惑。该实现是否比我正在使用的更好(当然,他正在使用泛型这一事实)?
他的代码:
public static <T> Set<Set<T>> powerSet(Set<T> originalSet) {
Set<Set<T>> sets = new HashSet<Set<T>>();
if (originalSet.isEmpty()) {
sets.add(new HashSet<T>());
return sets;
}
List<T> list = new ArrayList<T>(originalSet);
T head = list.get(0);
Set<T> rest = new HashSet<T>(list.subList(1, list.size()));
for (Set<T> set : powerSet(rest)) {
Set<T> newSet = new HashSet<T>();
newSet.add(head);
newSet.addAll(set);
sets.add(newSet);
sets.add(set);
}
return sets;
}