Stern-Brocot ağaç her bir fraksiyon, yukarıda seviyeleri içinde komşu iki bileşenden numerators ve paydası ekleyerek elde edilir fraksiyonların bir ikili ağaçtır.
"Son nokta kesirleri" ile başlayarak 0/1
ve 1/0
oradan başlayarak ve oradan, bu kesirlerin pay ve paydalarını birbirine ekleyerek birbirini izleyen her kesir çifti arasına bir kesir yerleştirerek tekrarlanır:
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
Stern-Brocot ağacı (her tekrarında n
inci yineleme) vardır, 2^n + 1
biz bir kısmını atfedebilecekleri hangi sırayla elemanları, 0/2^n
için 2^n/2^n
. Her yeni yineleme, birbirini izleyen her fraksiyon çifti arasına bir "fraksiyon" ekler.
Bu, Stern-Brocot ağacını pozitif rasyonel sayılar ve 0 ve 1 arasındaki ikili kesirler arasında bire bir eşleme yapar, böylece iki setin aynı kardinaliteye sahip olduğuna dair bir kanıt görevi görür.
Göreviniz, pozitif bir rasyonel sayının pay ve paydası göz önüne alındığında, o kesirin Stern-Brocot ağacındaki konumuna karşılık gelen ikili kesiri belirleyen bir program veya işlev yazmaktır.
Giriş ve çıkış örnekleri aşağıda verilmiştir:
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)
Desteklemeniz gerekmeyen, ancak referans olarak dahil edilen girdiler:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
Bu hedefe ulaşmak için herhangi bir dilde en kısa program kazanır.
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
, vs.). Bir düğüm için bu şekilde oluşturulan sayı ise n
, 2^lg n
(ikili günlük) ayarlanan en yüksek bittir n
ve istenen ikili kesirdir (2*(n - 2^lg n) + 1) / 2^(lg n + 1)
. (En yüksek set-bit'i içeren bir komut setinde bir montajcı çözümü deneyen herkes muhtemelen bu yaklaşımı kullanmak isteyecektir).