ลดพื้นที่ค้นหาอย่างชาญฉลาด
ตรึงตัวแปรหนึ่งตัวแล้วค้นหาส่วนที่เหลือ
ลดพื้นที่ค้นหาอย่างชาญฉลาด เป็นบทเรียน Competitive Programming Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Competitive Programming Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน
ค้นหาให้น้อยลง ได้คำตอบเดิม
บางครั้งการลองทุกกรณีอาจช้าเกินไปเพียงเล็กน้อย วิธีแก้คือ ลดขนาด สิ่งที่ต้องค้นหาโดยไม่ทำให้คำตอบที่ถูกต้องหายไป 🙂
ตรึงตัวแปรหนึ่งตัว
เทคนิคที่ทรงพลังคือ ตรึง ตัวแปรหนึ่งตัวด้วยการวนลูปผ่านค่าของมัน แล้วแก้ส่วนที่เหลือให้เร็วขึ้น คุณเปลี่ยนจากการค้นหาครั้งใหญ่เป็นการค้นหาขนาดเล็กหลายครั้ง
จาก N ยกกำลังสองเป็น N log N
ตรึงสมาชิกตัวแรก แล้วใช้ การค้นหาแบบทวิภาค หรือแฮชเพื่อหาสมาชิกคู่ของมัน วิธีนี้เปลี่ยนการไล่ตรวจแบบ O(n ยกกำลังสอง) ให้เป็นประมาณ O(n log n)
for a in arr:
if (target - a) in seen:
return True
seen.add(a)ตัดแขนงที่เป็นไปไม่ได้
ระหว่างการค้นหา ให้หยุดทันทีเมื่อเส้นทางใด ไม่สามารถ ทำได้ดีกว่าคำตอบที่ดีที่สุดในขณะนั้น แขนงที่ข้ามไปจะไม่เสียเวลาในการสำรวจ
เรียงลำดับเพื่อใช้จุดตัด
การเรียงลำดับก่อนมักทำให้คุณ หยุด ลูปได้เร็ว เมื่อค่าต่าง ๆ ผ่านเกณฑ์ที่กำหนด คุณก็ทราบว่าส่วนที่เหลือไม่สามารถช่วยได้
ใช้ประโยชน์จากสมมาตร
หากการสลับสมาชิกสองตัวให้ผลลัพธ์เหมือนเดิม ให้ค้นหาเพียง ลำดับ เดียว การนับแต่ละกรณีเพียงครั้งเดียวอาจลดงานลงได้ครึ่งหนึ่งหรือมากกว่านั้น
พบกันตรงกลาง
แบ่งสมาชิกออกเป็นสองครึ่ง ไล่ตรวจแต่ละครึ่ง แล้ว รวม ผลลัพธ์เข้าด้วยกัน วิธีนี้ลดการค้นหาจาก 2^n เหลือการทำงานประมาณ 2^(n/2)
เก็บงานที่ทำซ้ำไว้ใช้ซ้ำ
หากปัญหาย่อยเดิมปรากฏขึ้นอีกครั้ง ให้จัดเก็บผลลัพธ์ไว้แล้ว นำกลับมาใช้ซ้ำ การจดจำผลลัพธ์จะตัดแขนงที่ต้องทำซ้ำทั้งหมดออกจากการค้นหา
หาขอบเขตก่อนแตกแขนง
คำนวณ ขอบเขต ในกรณีดีที่สุดสำหรับแขนงหนึ่ง หากแม้แต่กรณีที่ดีที่สุดของแขนงนั้นยังแพ้ ก็ข้ามแขนงนั้นไปทั้งหมดเพื่อประหยัดเวลา
รักษาความถูกต้อง
การตัดทอนทุกครั้งต้อง ปลอดภัย โดยตัดเฉพาะเส้นทางที่ไม่สามารถชนะได้จริง ทดสอบเทียบกับการลองทุกกรณีแบบพื้นฐานเพื่อยืนยันว่าไม่มีคำตอบใดหายไป
ลดขนาดแล้วค่อยค้นหา
ใช้เทคนิคเหล่านี้เมื่อการลองทุกกรณี เกือบ จะทันเวลาแต่ยังช้าอยู่ ตรึงตัวแปร ตัดแขนง หรือแบ่งปัญหา แล้วการค้นหามักจะอยู่ภายในขีดจำกัดได้
ตรวจสอบอย่างรวดเร็ว
การไล่ตรวจสับเซตทั้งหมดจำนวน 2^n ชุดช้าเกินไป แต่คุณสามารถแบ่งสมาชิกออกเป็นสองครึ่งได้
สรุป
ลดการค้นหาด้วยการ ตรึง ตัวแปร ตัดแขนงที่ไม่มีทางชนะ ใช้ประโยชน์จากสมมาตร หรือค้นหาจากตรงกลาง ทั้งนี้ต้องทำให้การตัดทอนทุกครั้งปลอดภัย 🚀
เรียนรู้ Python ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “ลดพื้นที่ค้นหาอย่างชาญฉลาด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ลดพื้นที่ค้นหาอย่างชาญฉลาด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Competitive Programming Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Competitive Programming Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ลดพื้นที่ค้นหาอย่างชาญฉลาด”
ตรึงตัวแปรหนึ่งตัวแล้วค้นหาส่วนที่เหลือ คุณปฏิบัติ Competitive Programming Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Competitive Programming Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Competitive Programming Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ลดพื้นที่ค้นหาอย่างชาญฉลาด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Competitive Programming Academy นี้ได้ไหม
ได้ บทเรียน Competitive Programming Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การลองทุกกรณีเป็นกลยุทธ์ที่ใช้ได้
- แจกแจงด้วย itertools
- แจกแจงเซตย่อยด้วยบิตมาสก์
- ลดพื้นที่ค้นหาอย่างชาญฉลาด