lower_bound เพื่อลดเวลาเขียนโค้ด
อัลกอริทึมจะทำการตรวจสอบค่าที่ "จุดกึ่งกลาง" ของขอบเขตการค้นหาเสมอ
หยุดการทำงานและคืนค่าตำแหน่งนั้นทันที
เลื่อนขอบเขต (low หรือ high) เพื่อทิ้งข้อมูลครึ่งหนึ่งที่ไม่เกี่ยวข้อง
"ข้อมูลต้องเรียงลำดับเสมอ (Sorted Array)"
while (low <= high)ในวิธีนี้ ขอบเขตจะถูกบีบเข้าหากันจน low > high จึงจบการทำงาน
(low + high) / 2?low + high อาจทำให้เกิด Integer Overflow
ควรใช้: low + (high - low) / 2
เป็นแนวทางปฏิบัติที่ช่วยให้โค้ดของคุณปลอดภัยแม้ข้อมูลจะมีขนาดใหญ่ถึง \(10^9\)
แนวคิดคือการ "กระโดด" ไปข้างหน้าด้วยระยะทางที่ลดลงทีละครึ่ง
C++ มีฟังก์ชันที่มีประสิทธิภาพสูงให้ใช้อยู่แล้วใน <algorithm>
หาตัวแรกที่ ค่า \(\ge x\)
หาตัวแรกที่ ค่า \(> x\)
"ประหยัดเวลาและลดโอกาสเกิด Bug ในการแข่งขัน"
การใช้ b - a ทำได้เพราะ STL คืนค่าเป็น Iterators
*หมายเหตุ: อาเรย์ต้องถูกเรียงลำดับก่อนเสมอ
ใช้เมื่อเราต้องการหาค่า \(k\) ที่น้อยที่สุดหรือมากที่สุดที่ เป็นไปได้
ต้องมีฟังก์ชัน ok(x) ที่มีความเป็น Monotone (เช่น ถ้า \(x\) ใช้ได้ ทุกค่าที่มากกว่า \(x\) ก็ต้องใช้ได้)
"ความซับซ้อนรวมจะเป็น \(O(N \log Z)\)[เมื่อ \(Z\) คือขอบเขตคำตอบ"
โค้ดนี้จะหาค่า \(x\) ที่ใหญ่ที่สุดที่ ok(x) เป็นเท็จ แล้วบวกเพิ่มอีก 1
มีไส้กรอก \(N\) ชิ้นยาวต่างกัน ต้องการตัดให้ได้ \(M\) ชิ้นยาวเท่ากัน โดยยาวที่สุดที่เป็นไปได้
แนวทางการ 구현:
ok(len) ok(len): เช็คว่าถ้าตัดยาว len จะได้ไส้กรอก \(\ge M\) ชิ้นหรือไม่ ทำไมต้องวน 100 รอบ?
เพื่อให้ได้ความแม่นยำสูงสุด (Precision) และปลอดภัยจากการวนลูปไม่รู้จบ (Infinite loop)
"double มีความละเอียดเพียงประมาณ 15-17 หลัก"
การใช้ while (hi - lo > 1e-9) อาจเกิดปัญหากับคำตอบที่มีค่าขนาดใหญ่มาก
ใช้ Fixed Iterations (เช่น 100 รอบ) เสมอในการแข่งขัน
หาค่าสูงสุด/ต่ำสุดของฟังก์ชันที่มีความต่อเนื่อง (Monotonic Functions)
ใช้เพื่อตรวจสอบคุณสมบัติที่ไม่เปลี่ยนแปลงในระหว่างกระบวนการแก้ปัญหา
เขียนฟังก์ชัน Binary Search ของคุณเองและเปรียบเทียบกับ std::lower_bound
จงหาค่าที่น้อยที่สุดที่เป็นไปได้ของค่าที่มากที่สุดจากชุดข้อมูล (โจทย์แนวการแบ่งงาน)
1. Print Mid: แสดงค่า mid และผลของ ok(mid) ในทุกรอบ
2. Test Edge Cases: ทดสอบกับ \(N=0, 1\) หรือกรณีที่ไม่มีคำตอบ
3. Local Testing: ใช้ไฟล์ input.txt และ output.txt เพื่อความรวดเร็ว
ส่วนของ Sorting and Searching ที่แนะนำโดยผู้เชี่ยวชาญ
ค้นหา Tag: 'binary search' เพื่อโจทย์ระดับสากล
"การทำโจทย์ย้อนหลังคือวิธีพัฒนาที่เร็วที่สุด (Up-solving)"
mid
15.00 - 17.00 น.
Practice: Binary Search Problems
"โค้ดของคุณคือคำตอบที่ดีที่สุด" เจอกันในแล็บครับ!