タグ付けされた質問 「combinatorics」


12
高速順列->数->順列マッピングアルゴリズム
n個の要素があります。例として、7つの要素1234567があるとします。7つあることは知っています。=これらの7つの要素で可能な5040の順列。 2つの関数で構成される高速アルゴリズムが必要です。 f(number)は、0〜5039の数値を一意の順列にマップします。 f '(順列)は、順列を生成元の数にマッピングします。 番号と順列の対応は気にしません。各順列には固有の番号があります。 したがって、たとえば、私は関数を持っているかもしれません f(0) = '1234567' f'('1234567') = 0 頭に浮かぶ最も速いアルゴリズムは、すべての順列を列挙し、両方向にルックアップテーブルを作成することです。そのため、テーブルが作成されると、f(0)はO(1)になり、f( '1234567')は文字列の検索。ただし、これは特にnが大きくなるとメモリを大量に消費します。 誰もがすぐに動作し、メモリの不利な点なしに動作する別のアルゴリズムを提案できますか?

12
隣接する等しい要素なしでリストのすべての順列を生成します
リストを並べ替えるとき a = [1,2,3,3,2,2,1] sorted(a) => [1, 1, 2, 2, 2, 3, 3] 結果のリストでは、等しい要素が常に隣接しています。 どうすれば反対のタスクを実行できますか?リストをシャッフルして、等しい要素が決して(またはできるだけまれに)隣接しないようにしますか? たとえば、上記のリストの場合、考えられる解決策の1つは次のとおりです。 p = [1,3,2,3,2,1,2] より正式には、リストが与えられると、ペアの数を最小化するリストaの順列pを生成しp[i]==p[i+1]ます。 リストは大きいため、すべての順列を生成してフィルタリングすることはできません。 ボーナス質問:そのようなすべての順列を効率的に生成する方法は? これは私がソリューションをテストするために使用しているコードです:https://gist.github.com/gebrkn/9f550094b3d24a35aebd UPD:多くの人が優れた回答を投稿したため、ここで勝者を選ぶのは難しい選択でした。@VincentvanderWeele、@デビッドEisenstat、@Coady、@ enrico.bacisと@srgerg完璧に可能な限り最高の順列を生成する機能を提供します。@tobias_kとDavidもボーナスの質問に答えました(すべての順列を生成します)。正しさの証明のためのDavidへの追加のポイント。 @VincentvanderWeeleのコードが最速のようです。

5
順列を怠惰に生成する
Clojureでそれらの遅延リストを作成できるような方法でセットの順列を生成するアルゴリズムを探しています。つまり、各順列は要求するまで計算されず、すべての順列を一度にメモリに保存する必要がない順列のリストを繰り返し処理したいと思います。 あるいは、特定のセットが与えられると、そのセットの「次の」順列を返すアルゴリズムを探しています。これにより、独自の出力で関数を繰り返し呼び出すと、元のセットのすべての順列が循環します。いくつかの順序(順序は関係ありません)。 そのようなアルゴリズムはありますか?私が見た順列生成アルゴリズムのほとんどは、それらをすべて一度に(通常は再帰的に)生成する傾向があり、非常に大きなセットに拡張することはできません。Clojure(または別の関数型言語)での実装は役に立ちますが、擬似コードから理解できます。

6
繰り返しによる順列の生成
itertoolsについては知っていますが、繰り返しなしでしか順列を生成できないようです。 たとえば、2つのサイコロで可能なすべてのサイコロを生成したいとします。したがって、繰り返しを含む[1、2、3、4、5、6]のサイズ2のすべての順列が必要です:(1、1)、(1、2)、(2、1)...など 可能であれば、これを最初から実装したくありません
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.