2016-07-22 8 views
0

順列を生成することに関する記事は多数ありますが、私は、ちょっと違う順列のアルゴリズム的な必要性があります。反復せずにペアのすべての順列を生成するアルゴリズム

要素の集合(a、b、c、.. n)が与えられた場合、要素の任意の組み合わせで(ab)、(cd)、(ef) ペア(ab)と(ba)は同じです。 また、必要な順列は、順番にのみ異なるものであってはならない:(ab)、(ef)、(cd)は(ef)、(cd)、(ab)と同一である。

例として、 6つの要素a、b、c、d、e、fの順列の完全なリスト

これは、私はアルゴリズムが生成したいペアのリストである:

(ab), (cd), (ef) 
(ab), (ce), (df) 
(ab), (cf), (de) 
(ac), (bd), (ef) 
(ac), (be), (df) 
(ac), (bf), (de) 
(ad), (bc), (ef) 
(ad), (be), (cf) 
(ad), (bf), (ce) 
(ae), (bc), (df) 
(ae), (bd), (cf) 
(ae), (bf), (cd) 
(af), (bc), (de) 
(af), (bd), (ce) 
(af), (be), (cd) 

Iは4対(8つの要素)のためのアルゴリズムを想像しようとしたが、私はできませんでした。

典型的な解決策は、すべての行が要素aで始まることです。他の開始要素は、(ab)が(ba)と(cd)、(ab)が(ab)、(cd)に等しいという2つの規則と競合する可能性があります。だから、要素aですべてを始めることが重複を避ける最も簡単な方法です。

私はクヌスの答えを見つけようとしましたが、私はあまりにも数学者ではありません。順列と組み合わせの章で与えられているこのような特定の運動を100ほど見つけることができません。それはおそらくそこにあるが、私が見つけ出すのではない。

ここで誰かが私に良いアルゴリズム(パスカルまたはC言語であることが望ましい)を表示したいと考えています。

+1

http://stackoverflow.com/questions/32493769/sets-of-all-disjoint-pairs/32494810#32494810 – MBo

+0

最初の要素とそれに続くすべての要素を(ループを使用して)結合し、次に各ペアa、x)は残りの集合と再帰する – m69

答えて

2

あなたの各ペアには2つの要素のサブペアがありますので、私はあなたのキャラクターリストの長さが偶数であると仮定しています。アルゴリズム

  1. あなたは、リストの最初の要素を取り、リスト内に残っている要素のそれぞれでこれをペアリング。

  2. 各ペアを作成してリストから2つの要素を削除すると、問題は2つの要素の少ないリストに減少します。
  3. リストサイズが2になるまでこの手順を繰り返します。
  4. これは、必要なペアの最後のサブペアです。
  5. これで完了です。

Pythonのコード

ここで私はpythonでアルゴリズムの上に実装するコードを提供しています:

# Keep coding and change the world..And do not forget anything..Not Again.. 


def func(chr_list, pair=""): 
    l = len(chr_list) 
    if l == 2: 
     print pair + '(' + chr_list[0] + chr_list[1] + ')' 
    else: 
     i = 0 
     l -= 1 
     ch1 = chr_list[0] 
     chr_list = chr_list[1:] 
     while i < l: 
      ch2 = chr_list[i] 
      chr_list.remove(ch2) 
      func(chr_list[:], pair + '(' + ch1 + ch2 + '), ') 
      chr_list.insert(i, ch2) 
      i += 1 


func(['a', 'b', 'c', 'd', 'e', 'f']) 

を、これはあなたを助けることを願っています。

関連する問題