Binary search เป็นวิธีที่รวดเร็วในการหาค่าเป้าหมายในลิสต์ที่เรียงลำดับแล้ว คุณตรวจดูค่าตรงกลาง ตัดค่าที่เหลือทิ้งไปครึ่งหนึ่ง แล้วทำซ้ำ ถ้าลิสต์ไม่ได้เรียงลำดับ ตรรกะนี้จะใช้ไม่ได้

สำหรับลิสต์ที่เรียงจากน้อยไปมาก กฎนั้นง่ายมาก: ถ้าค่าตรงกลางน้อยกว่าค่าเป้าหมาย ให้ค้นหาทางขวา ถ้ามากกว่า ให้ค้นหาทางซ้าย เพราะช่วงข้อมูลถูกลดลงประมาณครึ่งหนึ่งทุกครั้ง Binary search จึงใช้เวลา O(logn)O(\log n)

Binary search ทำงานอย่างไรกับลิสต์ที่เรียงแล้ว

ใช้ลิสต์ที่เรียงแล้วนี้:

[3,7,12,18,24,31,39,45,52][3, 7, 12, 18, 24, 31, 39, 45, 52]

สมมติว่าค่าเป้าหมายคือ 3131

เริ่มจากช่วงทั้งหมด ค่าตรงกลางคือ 2424 เนื่องจาก 31>2431 > 24 ทุกค่าทางซ้ายของ 2424 จึงตัดทิ้งได้ และการค้นหาจะดำเนินต่อในช่วง

[31,39,45,52][31, 39, 45, 52]

ตอนนี้ค่าตรงกลางคือ 3939 เนื่องจาก 31<3931 < 39 ทุกค่าทางขวาของ 3939 จึงตัดทิ้งได้ ทำให้ช่วงกลายเป็น

[31][31]

ตอนนี้ค่าตรงกลางคือ 3131 ดังนั้นการค้นหาจึงหยุด แนวคิดสำคัญไม่ได้มีแค่ว่าพบค่าเป้าหมายเท่านั้น แต่คือในเวลาเพียงสองครั้งของการเปรียบเทียบ ช่วงตัวเลือกถูกลดจาก 99 ค่าเหลือเพียง 11

ทำไม Binary search จึงเป็น O(logn)O(\log n)

การเปรียบเทียบแต่ละครั้งจะตัดตัวเลือกที่เหลือออกไปประมาณครึ่งหนึ่ง หลังจากหนึ่งขั้นตอน จะเหลือประมาณ n/2n/2 รายการ หลังจากสองขั้นตอน จะเหลือประมาณ n/4n/4 รายการ หลังจาก kk ขั้นตอน ขนาดที่เหลือจะประมาณ

n2k\frac{n}{2^k}

การค้นหาจะจบเมื่อปริมาณนี้มีค่าประมาณ 11 ดังนั้นจำนวนขั้นตอนจึงเป็นไปตาม

2kn2^k \approx n

เมื่อนำ log2\log_2 ทั้งสองข้าง จะได้ว่า

klog2nk \approx \log_2 n

นี่คือเหตุผลที่ Binary search ขยายขนาดได้ดี การค้นหาแบบเชิงเส้นอาจต้องตรวจมากถึง nn ครั้ง แต่ Binary search ต้องตรวจเพียงเท่าที่จำเป็นเพื่อหารช่วงให้เล็กลงครึ่งหนึ่งไปเรื่อย ๆ

นี่คือเวอร์ชันแบบวนซ้ำมาตรฐานใน Python:

ต้องการความช่วยเหลือในการแก้โจทย์?

อัปโหลดคำถามของคุณแล้วรับคำตอบแบบทีละขั้นตอนที่ผ่านการตรวจสอบในไม่กี่วินาที

เปิด GPAI Solver →