Eine binäre Folge der Länge ist nur eine geordnete Folge so dass jedes entweder oder . Um alle diese Binärsequenzen zu erzeugen, kann man die offensichtliche Binärbaumstruktur folgendermaßen verwenden: Die Wurzel ist "leer", aber jedes linke Kind entspricht der Addition von zu der vorhandenen Zeichenfolge und jedes rechte Kind zu einer . Nun ist jede binäre Sequenz einfach ein Pfad der Länge , der an der Wurzel beginnt und an einem Blatt endet.
Hier ist meine Frage:
Können wir es besser machen, wenn wir nur alle Binärzeichenfolgen der Länge erzeugen wollen, die genau Nullen und Einsen haben?
Mit "können wir es besser machen" meine ich, wir sollten eine geringere Komplexität haben als der alberne Algorithmus, der zuerst den gesamten Baum darüber erstellt und dann versucht, diese Pfade mit einer gleichen Anzahl von "linken" und "rechten" Kanten zu finden.
quelle
Antworten:
Offensichtlich gibt es Binärzeichenfolgen der Länge . Um die Binärdatei zu durchlaufen, muss ein Algorithmus jeden Knoten einmal besuchen, dh er muss Schritte.4n 2n
Betrachten wir einen rekursiven Algorithmus, der den von Ihnen beschriebenen Baum durchläuft, aber die Anzahl der Einsen und Nullen auf seinem Weg zählt, dh nur den guten Teil des Baums durchläuft.n n n 2n
Aber wie viele solcher Binärzeichenfolgen mit 0 und 1 gibt es? Wir wählen 1 für unsere Strings der Länge und verwenden die Stirlingsche Formel in Schritt 2:
BEARBEITEN
Dank der Kommentare von Peter Shor können wir auch die Anzahl der Schritte analysieren, die der zweite Algorithmus benötigt, der die Einsen und Nullen zählt. Ich zitiere seinen Kommentar von unten:
Unter erneuter Verwendung der Stirlingschen Formel erhalten wir als Laufzeit des neuen Algorithmus.
quelle
Vielleicht bin ich dick, aber die ursprüngliche Frage fragte nach einer Möglichkeit, alle "ausgeglichenen" Binärsequenzen der Länge 2n zu erzeugen, die effizienter war, als einen Baum aller Binärsequenzen der Länge 2n zu durchlaufen und nur diejenigen auszugeben, die ausgeglichen waren. Warum also überhaupt einen Baum benutzen?
Hier ist der Pseudocode für einen rekursiven Algorithmus, der alle diese Sequenzen generiert (das Schlüsselwort "Ausbeute" sendet eine Sequenz an die Ausgabe):
Wenn ich etwas falsch verstehe, sagen Sie es mir bitte, aber es scheint mir, dass dies die effizienteste Antwort auf das tatsächlich gestellte Problem ist, bei dem die Verwendung eines Baumes nie angegeben wurde.
quelle