次のパワーセットを作成します{"A", "B", "C"}
。
擬似コード:
val set = {"A", "B", "C"}
val sets = {}
for item in set:
for set in sets:
sets.add(set + item)
sets.add({item})
sets.add({})
アルゴリズムの説明:
1)sets
空のセットに初期化します: {}
.
2)各アイテムを繰り返します{"A", "B", "C"}
3)あなたのそれぞれset
を繰り返しますsets
。
3.1) のコピーである新しいセットを作成しますset
。
3.2) を に追加item
しnew set
ます。
3.3) を に追加new set
しsets
ます。
4) を に追加item
しますsets
。
4) 反復が完了します。に空のセットを追加しますresultSets
。
チュートリアル:
sets
各反復後の内容を見てみましょう。
反復 1、項目 = "A":
sets = {{"A"}}
反復 2、項目 = "B":
sets = {{"A"}, {"A", "B"}, {"B"}}
反復 3、項目 = "C":
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}}
反復が完了し、空のセットを追加:
sets = {{"A"}, {"A", "B"}, {"B"}, {"A", "C"}, {"A", "B", "C"}, {"B", "C"}, {"C"}, {}}
セットのサイズは 2^|set| です。= 2^3 = 8 これは正しいです。
Java での実装例:
public static <T> List<List<T>> powerSet(List<T> input) {
List<List<T>> sets = new ArrayList<>();
for (T element : input) {
for (ListIterator<List<T>> setsIterator = sets.listIterator(); setsIterator.hasNext(); ) {
List<T> newSet = new ArrayList<>(setsIterator.next());
newSet.add(element);
setsIterator.add(newSet);
}
sets.add(new ArrayList<>(Arrays.asList(element)));
}
sets.add(new ArrayList<>());
return sets;
}
入力: [A, B, C]
出力:[[A], [A, C], [A, B], [A, B, C], [B], [B, C], [C], []]