私は、順列のランクを計算するための効率的なアルゴリズムを見つけようとしています。その逆もあります(与えられたランクの順列)。誰かが指針を与えることはできますか?順列ランクアルゴリズム
答えて
配列に繰り返し要素がありますか?
のみユニークな要素がある場合は、次の再帰は、長さn-m+1
の順列としてX[m:n]
のランクを計算する:
ランク(X、M:N)= RankOfElement(X [M]、 X [M:N])*階乗(N - M)+ランク(X、(M + 1):N)
両方Rank
とRankOfElement
はゼロベース(0から始まる)です。例えば、Rank(permutation) = Rank(first permutation starting with first letter of permutation) + Rank(permutation with first letter deleted)
文字列EDCBA
の場合はRank(EDCBA) = Rank(EABCD) + Rank(DCBA)
を意味します。
これは最初の用語を変更することにより、非固有例に拡張することができる。
ランク(X、M:N)=ランク(X、(M + 1):N)+Σ {X [m:n]} - {y}の組み合わせの数(y∈X[m:n]、y <×[m])である。
EDIT
私はちょうどあなたのコメントを見ました。素敵なグラフィック!あなたが望むものは、木が横切ることです。
あなたの順列の各位置がツリー内でどのように異なったレベルになっているかに注目してください。そのツリー内のルートからリーフノードまでのすべてのパスが可能な順列です。
これは、あなたの「ランク」にある程度の柔軟性があることを意味します。あなたはそれを定義するようになる。あなたが各葉ノードをまっすぐ進むにつれて増えた葉ノードの番号付けを与えるために、あなたがツリー(inorder、preorder、postorder、postorder、DFS、BFS)を越えて望むどんなタイプのトラバーサルを作成してもかまいません。
あなたの順列のトラバースとランク付けを選択するだけで、あなたのアプリケーションに最も自然で便利なものを見つけることができます。あなたが選ぶことができない場合は、/ dev/randomを調べて使用する必要があります。
のEND EDIT
まあ、最初は、ベース変換のように考えることがあります。すべての順列はある点(それはランクです)です。バイナリを考える。 n個の文字に対して2アルファベット順列を計算するための効率的なアルゴリズムは何ですか?ランクを割り当てるだけで、順列があります。
他のサイズのアルファベットでも同じことが起こります。あなたの位置が異なるサイズのアルファベットを持っている場合は明らかに、物事はもっと複雑ですが、あなたはまだ組み合わせ論を行うことができます。
total possible = pi(|a|_i) for all i in positions
|a|_i alphabet size at position i
and assuming all |a|_i are equal to b you have
rank of permutation = sigma(b**i * a_i)
a_i is actual alphabet character chosen at position i.
So over the 5 alphabet (ABCDE)
The rank of AAAAA = 0 (or 1)
The rank of EEEED = 5**6 - 2
次にランクから順列を取得するにはちょうど基数式を使用します。私が覚えているようだ:
a_i = (P % b**(i+1) - P & (b**i))/(b**i)
このコンビナトリアルと基数の観点から考えると、より複雑なケースであっても間違ってはいけません。あなたが望むランクを取ってアルファベットに適したベースに変換してください。あなたは興味があるかもしれませんMixed Radix Conversion on Wikipedia, here
- 1. 昇順リスト順列
- 2. ハスケル:順列の順
- 3. 行/列順列
- 4. 順列
- 5. カスタム系列順
- 6. Pythonの順列
- 7. C++順列
- 8. 正方行列順列
- 9. PHP:配列順序
- 10. 順列不変ニューラルネットワーク
- 11. リストの順列 - Haskell
- 12. 順列:回避オーバーフロー
- 13. 順列効率的
- 14. 順列データ構造
- 15. ブースト::精神順列
- 16. 加重順列アルゴリズム
- 17. JOLT - 順列変換
- 18. struts文字列配列の順序
- 19. SQLクエリ - 文字列の順列
- 20. HTML:固定列+液体列逆順
- 21. 配列内の文字の順列
- 22. 複数列インデックスの列順序
- 23. PHPの文字列の順列
- 24. ソートマトリックスレポート列指定順序
- 25. CATransform3D行/列の順序
- 26. C#すべて順列
- 27. 私はこの順列に
- 28. Pythonの単語リスト順列
- 29. javascript非順列乱数ジェネレータ
- 30. 文字列の逆順
ここでhttp://stackoverflow.com/a/8958309/312172私はグラフィックを作成し、問題を説明し、解決策を1つの方法で与えました。あなたが右側の '関連する'問題のリストを見ると、多くの重複が見つかります。 –