web-dev-qa-db-ja.com

ラングフォードシーケンス-対称性の利用/対称性の削除

可能なラングフォードシーケンスの数を計算できるプログラムを作成しました( https://en.wikipedia.org/wiki/Langford_pairing )。


TL; DR LangfordsequencesはL(s、n)で定義されます。sは特定の数の出現回数です

そしてnは可能な数/色の数であり、それらの数はそれらが互いのポートである必要がある位置の数を定義します

enter image description here

画像はL(2、4)になります==>各番号には2つの出現があり、4つの異なる番号があります。 | L(2,4)|の量制約を満たす可能な置換は1つしかないため、1になります。

enter image description here


可能な順列の量を計算する背後にある考え方は次のとおりです。 L(2,4)ルートとしてすべて0のビットセット[s * n]から始めます

各深さで、すべての可能な順列を取得します。ここで、カレット番号(= n-深さ)のすべての発生は、優れたn-深さ位置離れています。

深さ1では、4の可能な位置をすべて取得します=>

10000100

01000010

00100001

可能な順列ごとに、衝突があるかどうかを確認します(使用されている位置の1つが別の番号によってすでに使用されている場合)。私は1であるビットの量を数えて、それらを親ビットと比較することでこれを行いました。 if(currentPos xor Parent).count()== Parent.count()+ sの場合、衝突は発生しなかったため、1つの深さまで到達できます。 (制約を示す3のすべての可能な順列をチェックしてください)

すべてのビットが1に等しい場合((currentPos xor Parent).count()== s * n]可能性のある順列に達しました。ここで、各数値は、各数値に対して互いに離れた値です。

enter image description here

これはこれまでのところ機能していますが、対称性を考慮していなかったため、結果として得られるはずの数値に比べて各数値が2倍になりました。 (L(s、n)の場合、私は常に2 * L(s、n)を取得します)

正しい結果を得るために、ツリーの対称性をどのように利用するか疑問に思っていました。


私の最初のアイデアは、ceil(len(Permutation)/ 2)順列(次の画像の赤の選択)に最初に使用するだけを使用することでした。しかし、これはあらゆる悪い結果をもたらしました。

enter image description here


私はあなたに私を助けてもらうためにここに何を投稿するべきか本当にわかりません-しかし、誰かが私にヒントや何かを与えることを願っています

AdvcandedのTy


7
Barney Stinson

Nが奇数になるとすぐに、レベル/深さ1の順列の半分を削除できます。 Nが偶数の場合、レベル/深さ2の順列の半分を削除します。

お役に立てれば幸いです。

1
Omar K