web-dev-qa-db-fra.com

Séquence de Langford - Utiliser la symétrie / Supprimer la symétrie

j'ai écrit un programme qui peut calculer le nombre de séquences de Langford possibles ( https://en.wikipedia.org/wiki/Langford_pairing ).


TL; DR Langford Les séquences sont définies par L (s, n) où s est le nombre d'occurrences d'un certain nombre

et n est le nombre de nombres/couleurs possibles, les nombres définissent le nombre de positions qu'ils doivent porter les uns sur les autres

enter image description here

L'image serait L (2, 4) ==> chaque numéro a 2 occurrences et il y a 4 nombres distincts. Le montant de | L (2,4) | serait 1 car il n'y a qu'une seule permutation possible qui satisfait les contraintes

enter image description here


L'idée derrière le calcul de la quantité de permutation possible est la suivante. L (2,4) Nous commençons avec un Bitset [s * n] de tous les 0 comme racine

à chaque profondeur, nous obtenons toutes les permutations possibles où toutes les occurrences du nombre de tourelle (= n-profondeur) sont d'excellentes positions de n-profondeur séparées.

en profondeur 1 on obtient toutes les positions possibles pour 4 =>

10000100

01000010

00100001

Par Permutation Possible, je vérifie s'il y a une collision (si l'une des positions utilisées est déjà utilisée par un autre numéro). J'ai fait cela en comptant la quantité de bits qui sont 1 et les ai comparés avec les bits parents. if (currentPos xor Parent) .count () == Parent.count () + s alors il n'y a pas eu de collision et je peux aller plus loin. (vérifiez toutes les permutations possibles pour 3 qui répondent aux contraintes)

si tous les bits sont égaux à un [(currentPos xor Parent) .count () == s * n] nous avons atteint une permutation possible où chaque nombre est sa valeur à part les uns des autres pour chaque nombre.

enter image description here

Cela fonctionne jusqu'à présent, mais ive a doublé chaque nombre par rapport à ce que je devrais obtenir, car je n'ai pas pris la symétrie en considération. (pour L (s, n) j'obtiens toujours 2 * L (s, n))

Je me demandais comment utiliser la symétrie de l'arbre pour obtenir les bons résultats.


Mon idée initiale était simplement d'utiliser simplement d'abord pour ceil (len (Permutation)/2) Permutations (Red-Selection sur l'image suivante). Mais cela a abouti à tous les pires résultats.

enter image description here


je ne sais pas vraiment ce que je devrais poster ici pour vous permettre de m'aider - mais j'espère que quelqu'un pourra me donner un indice ou quelque chose

Ty dans l'avancé


7
Barney Stinson

Vous pouvez supprimer la moitié des permutations au niveau/profondeur 1 dès que N est impair. Si N est pair, supprimez la moitié de la permutation au niveau/profondeur 2.

J'espère que je pourrais vous aider.

1
Omar K