Python で再帰を使用して配列の可能なすべてのパーティションを列挙するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-07 03:22:02
オリジナル
922 人が閲覧しました

How can I enumerate all possible partitions of an array in Python using recursion?

Python でパーティションを設定する

概要

要素のセットを分割するタスク要素の数が増えるにつれて、サブセットはますます困難になります。この記事では、Python を使用して配列を効率的に分割し、再帰を利用してこの複雑な問題を解決する手法を検討します。

再帰的アプローチ

指定された配列を分割するには、次のようにします。再帰的なアプローチを採用できます。 n 要素の配列の場合、問題を 2 つのシナリオに分けることができます:

  • シナリオ 1: n 番目の要素が既存のサブセットに配置される場合、残りの要素はn-1 個の要素はパーティション化する必要があります。
  • シナリオ 2: n 番目の要素が新しいシングルトン サブセットに配置される場合、残りの n-1 個の要素はパーティション化される必要があります。

これらのシナリオを配列に再帰的に適用することで、元の配列の可能なすべてのパーティションを列挙できます。

実装

この再帰アルゴリズムの実装Python では、次の手順が含まれます。

  1. 基本ケース: 長さ 1 の配列の場合、その要素のみを含むパーティションを返します。
  2. 再帰ステップ: より大きい長さの配列の場合1、シナリオ 1 と 2 を使用して配列を分割します。
  3. パーティションの生成: サブセットと要素を組み合わせて、可能なすべてのパーティションを生成します。

このアルゴリズムを実装する Python 関数は次のとおりです。

<code class="python">def partition(collection):
    if len(collection) == 1:
        yield [collection]
        return

    first = collection[0]
    for smaller in partition(collection[1:]):
        # Insert `first` in each of the subpartition's subsets
        for n, subset in enumerate(smaller):
            yield smaller[:n] + [[first] + subset] + smaller[n+1:]
        # Put `first` in its own subset 
        yield [[first]] + smaller</code>
ログイン後にコピー

使用例

この関数の使用法を説明するために、配列 [1, 2, 3, 4] について考えてみましょう。この配列に対してパーティション関数を実行すると、次のパーティションが生成されます:

  1. [[1, 2, 3, 4]]
  2. [[1], [2, 3, 4] ]
  3. [[1, 2], [3, 4]]
  4. [[1, 3, 4], [2]]
  5. [[1], [2], [3, 4]]
  6. [[1, 2, 3], [4]]
  7. [[1, 4], [2, 3]]
  8. [[1], [2, 3], [4]]
  9. [[1, 3], [2, 4]]
  10. [[1, 2, 4], [3]]
  11. [[1], [2, 4], [3]]
  12. [[1, 2], [3], [4]]
  13. [[1, 3], [2], [4]]
  14. [[1, 4], [2], [3]]
  15. [[1 ], [2], [3], [4]]

結論

この記事では、Python での配列の分割の問題に対する再帰的解決策を紹介しました。 。問題を小さなシナリオに分割し、これらのシナリオを再帰的に適用することで、配列の考えられるすべてのパーティションを効率的に列挙できます。このアプローチは、この困難なタスクに取り組むための堅牢で効率的なアルゴリズムを提供します。

以上がPython で再帰を使用して配列の可能なすべてのパーティションを列挙するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!