ホームページ > Java > &#&チュートリアル > Java セットのパワーセットを効率的に生成するにはどうすればよいですか?

Java セットのパワーセットを効率的に生成するにはどうすればよいですか?

DDD
リリース: 2024-12-02 18:48:11
オリジナル
754 人が閲覧しました

How to Efficiently Generate the Power Set of a Java Set?

最適な複雑さを備えた Java でのセットのパワーセットの取得

セットのパワーセットは、そのセットのすべてのサブセットのコレクションです。 n 個の要素を含むセットの場合、パワーセットには 2^n 個のサブセットが含まれます。

Java セットを考えてみましょう。

Set<Integer> mySet = new HashSet<>();
mySet.add(1);
mySet.add(2);
mySet.add(3);
ログイン後にコピー

関数 getPowerset を作成して、次のパワーセットを生成したいと考えています。このセット。この操作の理想的な複雑さは O(2^n) です。

Java のジェネリックスとセットを使用した実装の 1 つは次のとおりです。

public static <T> Set<Set<T>> getPowerset(Set<T> originalSet) {
    Set<Set<T>> sets = new HashSet<>();
    if (originalSet.isEmpty()) {
        sets.add(new HashSet<>());
        return sets;
    }
    List<T> list = new ArrayList<>(originalSet);
    T head = list.get(0);
    Set<T> rest = new HashSet<>(list.subList(1, list.size()));

    for (Set<T> set : getPowerset(rest)) {
        Set<T> newSet = new HashSet<>();
        newSet.add(head);
        newSet.addAll(set);
        sets.add(newSet);
        sets.add(set);
    }

    return sets;
}
ログイン後にコピー

この再帰的ソリューションは、セットの要素を反復処理します。それらを各サブセットに追加し、新しいサブセットを生成します。残りの要素のパワーセットを一貫して維持します。

入力例を使用した簡単なテストでは、期待される結果が得られます。

for (Set<Integer> s : getPowerset(mySet)) {
    System.out.println(s);
}
ログイン後にコピー

出力:

[]
[1]
[2]
[1, 2]
[3]
[1, 3]
[2, 3]
[1, 2, 3]
ログイン後にコピー

以上がJava セットのパワーセットを効率的に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート