Der Stern-Brocot-Baum ist ein binärer Baum von Brüchen, bei dem jeder Bruch durch Addition der Zähler und Nenner der beiden benachbarten Brüche in den obigen Ebenen erfasst wird.
Es wird erzeugt, indem mit 0/1
und 1/0
als "Endpunktbrüche" begonnen wird und von dort aus iteriert wird, indem ein Bruch zwischen jedes aufeinanderfolgende Bruchpaar gesetzt wird, indem die Zähler und Nenner dieser Brüche wie folgt addiert werden:
0. 0/1 1/0
1. 0/1 1/1 1/0
2. 0/1 1/2 1/1 2/1 1/0
3. 0/1 1/3 1/2 2/3 1/1 3/2 2/1 3/1 1/0
4. 0/1 1/4 1/3 2/5 1/2 3/5 2/3 3/4 1/1 4/3 3/2 5/3 2/1 5/2 3/1 4/1 1/0
In jeder Iteration des Stern-Brocot-Baums (der n
th-Iteration) gibt es 2^n + 1
Elemente in der Sequenz, denen wir einen Bruchteil von 0/2^n
bis zuordnen können 2^n/2^n
. Jede neue Iteration fügt einfach einen Bruch "auf halbem Weg" zwischen jedem Paar aufeinanderfolgender Brüche ein.
Dies macht den Stern-Brocot-Baum zu einer Eins-zu-Eins-Abbildung zwischen den positiven rationalen Zahlen und den binären Brüchen zwischen 0 und 1 und dient damit auch als Beweis dafür, dass die beiden Mengen dieselbe Kardinalität haben.
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die unter Berücksichtigung des Zählers und Nenners einer positiven rationalen Zahl in niedrigsten Begriffen den binären Bruch bestimmt, der der Position dieses Bruchs im Stern-Brocot-Baum entspricht.
Beispiele für Ein- und Ausgänge finden Sie unten:
2/3 -> 3/8 (4th number in iteration 3)
4/7 -> 9/32 (between 1/2 and 3/5 in the chart above)
1/1 -> 1/2 (middle number in the first iteration)
Eingaben, die Sie nicht unterstützen müssen, die jedoch als Referenz dienen:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
Das kürzeste Programm in einer Sprache, um dieses Ziel zu erreichen, gewinnt.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, etc.). Wenn die so erzeugte Zahl für einen Knoten ist n
, dann ist 2^lg n
(Binärprotokoll) das höchste gesetzte Bit n
, und der gewünschte Binärbruch ist (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (Jeder, der versucht, eine Assembler-Lösung in einem Befehlssatz mit einem Get-Highest-Set-Bit zu versuchen, wird wahrscheinlich diesen Ansatz verwenden wollen.)