ต้นไม้สเติร์น-Brocotเป็นต้นไม้ไบนารีของเศษส่วนที่แต่ละส่วนจะได้รับโดยการเพิ่ม numerators และ denominators ของทั้งสองเศษส่วนเพื่อนบ้านในระดับดังกล่าวข้างต้น
มันถูกสร้างขึ้นโดยเริ่มต้นด้วย0/1
และ1/0
เป็น "เศษส่วนจุดปลาย" และจากนั้นทำซ้ำโดยการวางเศษส่วนหนึ่งเศษระหว่างคู่ของเศษส่วนที่ต่อเนื่องกันโดยการเพิ่มตัวเศษและส่วนของเศษส่วนเหล่านั้นเข้าด้วยกันดังนี้:
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
ในการทำซ้ำของต้นไม้สเติร์น-Brocot (แต่ละn
ซ้ำชั้น) มี2^n + 1
องค์ประกอบในลำดับเพื่อที่เราสามารถอ้างส่วนจากการ0/2^n
2^n/2^n
การวนซ้ำใหม่แต่ละครั้งจะแทรกเพียงเศษเสี้ยว "ครึ่งทาง" ระหว่างเศษส่วนต่อเนื่องแต่ละคู่
สิ่งนี้ทำให้ต้นไม้ Stern-Brocot เป็นการทำแผนที่แบบหนึ่งต่อหนึ่งระหว่างตัวเลขที่เป็นบวกและเศษส่วนไบนารีระหว่าง 0 และ 1 ดังนั้นจึงเป็นหลักฐานว่าทั้งสองชุดมีความเหมือนกัน
งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดตัวเศษและตัวหารของจำนวนตรรกยะเชิงบวกในแง่ต่ำสุดกำหนดเศษส่วนไบนารีที่สอดคล้องกับตำแหน่งของเศษส่วนในต้นไม้ Stern-Brocot
ตัวอย่างของอินพุตและเอาต์พุตแสดงไว้ด้านล่าง:
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)
อินพุตที่คุณไม่จำเป็นต้องให้การสนับสนุน แต่รวมอยู่ในการอ้างอิง:
0/1 -> 0/1 (0/1 is considered the left number)
1/0 -> 1/1 (1/0 is considered the rightmost number)
โปรแกรมที่สั้นที่สุดในภาษาใด ๆ เพื่อให้บรรลุเป้าหมายนี้ชนะ
1/1 => 1
, 1/2 => 2
, 2/1 => 3
, 1/3 => 4
ฯลฯ ) หากหมายเลขที่สร้างขึ้นเพื่อให้โหนดเป็นn
แล้ว2^lg n
(เข้าสู่ระบบไบนารี) เป็นบิตที่สูงที่สุดในชุดและส่วนไบนารีที่ต้องการคือn
(2*(n - 2^lg n) + 1) / 2^(lg n + 1)
(ใครก็ตามที่พยายามใช้โซลูชันแอสเซมเบลอร์ในชุดคำสั่งที่มีการตั้งค่าบิตสูงสุดอาจต้องการใช้วิธีนี้)