จำนวนขั้นตอนสำหรับการค้นหาแบบไบนารี


12

กำหนดอินพุตของจำนวนเต็มบวกเอาท์พุทจำนวนขั้นตอนที่ใช้ในการค้นหาอินพุตผ่านการค้นหาไบนารีเริ่มต้นที่ 1

เรากำลังจำลองการค้นหาแบบไบนารีสำหรับจำนวนเต็มที่ได้รับเป็นอินพุตซึ่งผู้ค้นหาแบบจำลองสามารถเดาเลขจำนวนเต็มซ้ำ ๆ และได้รับการบอกว่ามันสูงเกินไปต่ำเกินไปหรือถูกต้อง กลยุทธ์สำหรับการค้นหาจำนวนเต็มมีดังนี้:

  • ให้ n เป็นจำนวนเต็มที่ระบุเป็นอินพุตที่เราพยายามค้นหา

  • เริ่มต้นด้วยการเดา 1 (สำหรับทุกการเดาให้เพิ่มจำนวนขั้นตอน (โดยไม่คำนึงว่าถูกต้องหรือไม่) และหยุดทันทีและส่งออกจำนวนขั้นตอนทั้งหมดหากเดาถูกต้อง)

  • เพิ่มการเดาซ้ำสองครั้งจนกว่าการคาดเดาจะมากกว่า n (หมายเลขเป้าหมาย) (หรือถ้ามันถูกต้อง แต่กฎนี้ถูกครอบคลุมโดยกฎการเดาที่ถูกต้องของเราที่กล่าวถึงข้างต้น)

  • ทีนี้ตั้งขอบเขตบนของกำลังแรกของ 2 ที่มากกว่า n (เช่นจำนวนที่เดาได้) และตั้งขอบเขตล่างของกำลัง 2 ตรงด้านล่าง

  • เดาค่าเฉลี่ย (ปัดเศษลง) ของขอบเขตบนและขอบเขตล่างซ้ำ ๆ หากสูงเกินไปให้ตั้งเป็นขอบเขตบน หากต่ำเกินไปให้ตั้งเป็นขอบเขตล่าง ขั้นตอนนี้รับประกันว่าจะส่งผลให้เดาถูกต้อง

นี่คือตัวอย่างสำหรับการป้อนข้อมูลของ n = 21:

1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 24 -> 20 -> 22 -> 21
\__________________________/
   repeated doubling      \________________________/
                             repeated averaging

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

นี่คือผลลัพธ์ทั้งหมดจาก n = 1 ถึง n = 100:

1
2
4
3
6
5
6
4
8
7
8
6
8
7
8
5
10
9
10
8
10
9
10
7
10
9
10
8
10
9
10
6
12
11
12
10
12
11
12
9
12
11
12
10
12
11
12
8
12
11
12
10
12
11
12
9
12
11
12
10
12
11
12
7
14
13
14
12
14
13
14
11
14
13
14
12
14
13
14
10
14
13
14
12
14
13
14
11
14
13
14
12
14
13
14
9
14
13
14
12

และนี่คือกรณีทดสอบที่ใหญ่กว่า:

1234 -> 21
1337 -> 22
3808 -> 19
12345 -> 28
32768 -> 16
32769 -> 32
50000 -> 28

คำตอบ:


10

Japt 13 13ไบต์

โอ้โห่ฉันกำลังเต้นทั้งเจลลี่และ Pyth ครั้ง: D

¢a1 ªJ +1+¢l

ทดสอบออนไลน์!

นี่คือกลยุทธ์ที่ฉันใช้: ให้xเป็นจำนวนเต็มเข้าและให้bเป็นxแทนx เอาต์พุตที่ถูกต้องคือ 1 + ความยาวของb + ดัชนีสุดท้ายของ1ในb , ลบ 1 หากดัชนีนี้เป็น 0


2
ฉันบอกคุณว่าเดนนิสจะเป็นผู้ชนะ
lirtosiast

7

เยลลี่, 18 15 10 9 ไบต์

B>WU;BḄBL

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบขนาดเล็กและกรณีทดสอบที่มีขนาดใหญ่

พื้นหลัง

ให้nเป็นจำนวนเต็มบวกและmอำนาจที่เล็กที่สุดของ2ที่เป็นมากกว่าหรือเท่ากับมากกว่าหรือเท่ากับn

  • สองเท่าของระยะเวลาหนึ่งขั้นตอนสำหรับแต่ละหลักในฐานเป็นตัวแทนของม.

  • ใช้การแทนเลขฐานสองของnลบตัวเลขแรกที่สำคัญที่สุด (เสมอ1 ) และเลขศูนย์ต่อท้ายทั้งหมด เฟสเฉลี่ยจะใช้เวลาหนึ่งขั้นตอนสำหรับแต่ละบาทที่เหลือ

เพื่อหลีกเลี่ยงการคำนวณmเราสังเกตว่าถ้าn <mจำนวนของเลขฐานสองของnจะน้อยกว่าจำนวนของเลขฐานสองของmอย่างแน่นอน

หากเราแทนที่เลขฐานสองแรกของnด้วย0ให้ย้อนกลับผลลัพธ์ผนวกเลขฐานสองดั้งเดิมและนำเลขศูนย์นำหน้าทั้งหมด

  • ถ้าnเป็นอำนาจของ2 , ทุกหลักแรก (แก้ไข) ครึ่งหนึ่งจะถูกนำออกเหลือเพียงหลักแทน binary เดิมของn = m

  • ถ้าnเป็นไม่ได้พลังของ2 , หลักในช่วงครึ่งแรกที่สอดคล้องกับหลักที่สำคัญที่สุดที่ไม่ไม่ได้ออกชดเชยสำหรับความจริงที่ว่าnมีเลขฐานสองน้อยกว่าเมตร

มันทำงานอย่างไร

B>WU;BḄBL  Main link. Input: n

B          Compute the binary representation of n.
 >W        Compare it with [n].
           n is positive, so it is not less than the first binary digit and the
           comparison yields zero. When comparing lists of different length, the
           elements in the longer list that do not have a pair remain untouched.
           Therefore, this will just zero out the first binary digit.
   U       Reverse the modified binary representation.
    ;B     Concatenate it with the unmodified binary representation of n.
      ḄB   Convert from binary to integer, and back to binary.
           This removes leading zeroes.
        L  Get the length of the resulting array.

’B;Bt0L(7 bytes) ทำงานในรุ่นล่าสุดของเยลลี่, ใช้วิธีการเช่นเดียวกับในคำตอบของฉันจูเลีย
Dennis

4

ES6, 38 ไบต์

x=>33-(g=Math.clz32)(x-1)+g(x&-x)-g(x)

ตามที่กล่าวถึงโดยคำตอบอื่น ๆ คุณสามารถคำนวณจำนวนขั้นตอนจากตำแหน่งของบิตแรกและบิตสุดท้าย

n=33-Math.clz32(x-1)จำนวนของขั้นตอนในขั้นตอนการเสแสร้งคือ เราต้องการ2ⁿ≥ x แต่n=33-Math.clz32(x)ให้2ⁿ> x เราจึงลบ 1 จาก x เพื่อชดเชย

n=Math.clz32(x&-x)-Math.clz32(x)จำนวนของขั้นตอนในขั้นตอนการหาค่าเฉลี่ยได้ง่ายขึ้นก็เพียง x&-xเป็นนิพจน์ที่ใช้งานง่ายซึ่งประเมินค่าไปที่บิตต่ำสุดx(เป็นกำลัง 2)


วิธีการx&-xทำงานหรือไม่ ฉันคิดว่ามันจะประเมินค่าสัมบูรณ์ของ x
ETHproductions

2
ฉันพบคำอธิบายที่ดีในหน้านี้ (ดู bit-hack # 7)
ETHproductions

2

Pyth, 15 13 ไบต์

h-y.ElQ/PPyQ2

ฉันพบว่าจำนวนที่ต้องคำนวณคือ 1 + 2*ceil(log_2(x)) - [number of 2s in x's prime factorization, minus 1 if x is a power of 2 greater than 1].

ลองมันนี่


2

Julia, 37 35 bytes

n->endof(strip(bin(n-1)bin(n),'0'))

ขอบคุณ @AlexA สำหรับการบันทึก 2 ไบต์!

สิ่งนี้ติดตามการสังเกตจากคำตอบของเยลลี่ของฉันแต่ข้อเสนอที่แตกต่างกับกรณีขอบ

ถ้าn> 1 , ฐานเป็นตัวแทนของn - 1มีหนึ่งหลักน้อยกว่าหนึ่งในอำนาจต่อไปของ2ซึ่งได้รับการชดเชยโดยไม่ได้เอาหลักแรกของฐานเป็นตัวแทนของn

ด้วยการลบศูนย์ทั้งหมดจากทั้งสองด้านเราจัดการกับตัวพิมพ์ขอบ1เช่นกัน


0

Haskell, 82 ไบต์

นี่เป็นการใช้งานที่ตรงไปตรงมาใน Haskell:

f x=[j|j<-[1..],let g i|i<2=1|x>g(i-1)=2*g(i-1)|1<2=div(g(i-1)+g(i-2))2,g j==x]!!0

หักกอล์ฟ:

f x = head [ stepNum | stepNum <- [1..], step stepNum == x]
  where
    prevStep i = step (i-1)
    step i | i == 1         = 1
           | x > prevStep i = 2 * prevStep i
           | otherwise      = div (prevStep i + step (i-2)) 2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.