Ich versuche zu berechnen de Bruijn-Sequenzen für Alphabete, die eine Anzahl von Zeichen haben, die no eine Potenz von zwei.
Für Alphabete mit 2^k Zeichen ist die Berechnung von de Bruijn-Sequenzen einfach: Es gibt einige einfache Regeln, wie zum Beispiel "Bevorzugen Sie Einsen" und "Bevorzugen Sie Gegensätzliches" die für die Erzeugung von B(2,n) funktionieren. B(2^k,n) ist genau dasselbe wie B(2,kn), wenn Sie die 1en und 0en als Binärcodes für die tatsächlichen Zeichen in Ihrem Alphabet lesen. So kann man z. B. B(2,8n) als eine Folge von Bytes mit der Länge n interpretieren.
Prefer Ones ist ganz einfach: Schreibe n Nullen. Schreiben Sie dann immer eine Eins, es sei denn, sie würde die Wiederholung einer n-langen Zeichenkette verursachen; andernfalls schreiben Sie eine Null.
Derzeit sehe ich nicht, wie man solche Regeln auf Alphabete verallgemeinern kann, die nicht die Größe einer Zweierpotenz haben.
Es gibt eine allgemeine Methode zur Berechnung von de Bruijn-Folgen über Graphen: Jede Sequenz der Länge n, die durch Ihr Alphabet erzeugt wird, sei ein Knoten; legen Sie eine Kante von A nach B, wenn die äußersten rechten n-1 Zeichen von A die gleichen sind wie die äußersten linken n-1 Zeichen von B. Beschriften Sie jede Kante mit dem letzten Zeichen der Zeichenkette im Kopfeck. Jede Eulerscher Pfad durch diesen Graphen wird eine de Bruijn-Sequenz erzeugen, und die besondere Konstruktion, die wir verwendet haben, garantiert, dass es mindestens einen solchen Pfad gibt. Wir können verwenden Fleurys Algorithmus um (nicht-deterministisch) einen Eulerschen Pfad zu konstruieren:
- Wählen Sie einen Scheitelpunkt.
- Verlassen Sie diesen Knoten über eine Kante und löschen Sie diese Kante, wobei Sie nur solche Kanten wählen, deren Löschung den Knoten vom Graphen trennen würde, wenn es keine Alternative gibt.
- Fügen Sie die Bezeichnung der soeben gelöschten Kante an Ihre Zeichenfolge an.
- Gehen Sie zu 2, bis alle Kanten verschwunden sind.
Die resultierende Zeichenkette ist eine de Bruijn-Sequenz.
Dieser Algorithmus ist etwas komplexer zu implementieren als Prefer Ones. Die Einfachheit von Prefer Ones besteht darin, dass man nur die bereits erzeugte Ausgabe zu Rate ziehen muss, um zu entscheiden, was zu tun ist. Gibt es eine einfache Möglichkeit, Prefer Ones (oder möglicherweise Prefer Opposites) auf Alphabete zu verallgemeinern, die nicht die Potenz von zwei haben?