J'essaie de calculer de Bruijn sequences pour les alphabets qui ont un certain nombre de caractères qui est pas une puissance de deux.Comment calculer des séquences de Bruijn pour des alphabets sans puissance de deux dimensions?
Pour les alphabets de 2 k caractères, le calcul des séquences de Bruijn est simple: il existe plusieurs règles simples, telles que "Prefer Ones" and "Prefer Opposites", qui permettent de générer B (2, n). B (2^k, n) est exactement le même que B (2, kn), si vous lisez les 1 et les 0 comme codes binaires pour les caractères réels de votre alphabet. Par exemple, vous pouvez interpréter B (2,8n) comme étant sur des séquences de longueur n octets.
Préférez Les on est assez simples: Ecrire n zéros. Ensuite, écrivez toujours un à moins que cela ne provoque la répétition d'une chaîne de longueur n; sinon, écris un zéro.
Actuellement, je ne vois pas comment généraliser de telles règles aux alphabets non-puissance-de-deux-taille.
Il existe une méthode générale de calcul des séquences de Bruijn via des graphes: que chaque séquence de longueur n générée par votre alphabet soit un noeud; mettre un bord de A à B ssi les n-1 caractères les plus à droite de A sont les mêmes que les n-1 caractères les plus à gauche de B. Étiqueter chaque bord avec le dernier caractère de la chaîne dans le sommet de la tête. Tout Eulerian path à travers ce graphique va générer une séquence de Bruijn, et la construction particulière que nous avons utilisée garantit qu'il y aura au moins un tel chemin. Nous pouvons utiliser Fleury's Algorithm pour construire (de manière non déterministe) un chemin eulérien:
- Choisissez un sommet.
- Quitte ce sommet via un bord et supprime ce bord, en choisissant uniquement les arêtes dont la suppression déconnecterait le sommet du graphe s'il n'y a pas d'alternative.
- Ajoutez à votre chaîne l'étiquette du bord que vous venez de supprimer.
- Aller à 2 jusqu'à ce que tous les bords soient partis.
La chaîne résultante sera une séquence de Bruijn.
Cet algorithme est un peu plus complexe à implémenter que Prefer Ones. La simplicité de Prefer Ones est qu'il suffit de consulter la sortie déjà générée pour déterminer ce qu'il faut faire. Existe-t-il un moyen simple de généraliser les préférences (ou, éventuellement, les opposés) à des alphabets de tailles non puissantes?
+1; un autre endroit pour chercher du code et une description détaillée est la [bibliothèque FXT et "fxtbook"] (http://www.jjj.de/fxt/) (voir les sections 18.1 et 18.2). –