1

リストのパワーセットを取得するために、次を実装しました。

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;
}

これは、再帰を使用してリストの累乗を取得する最適な方法ですか? これをインターネット上で実装する方法については、さまざまな方法を見てきましたが、私のものよりも多くのコピー (new の使用) を行っているようです。

たとえば、この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;
}
4

1 に答える 1