Competitive Programming Academy · บทเรียน

ลดพื้นที่ค้นหาอย่างชาญฉลาด

ตรึงตัวแปรหนึ่งตัวแล้วค้นหาส่วนที่เหลือ

บทเรียน 4 จาก 413 ขั้นตอน

ลดพื้นที่ค้นหาอย่างชาญฉลาด เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การลองทุกกรณีเป็นกลยุทธ์ที่ใช้ได้
  2. แจกแจงด้วย itertools
  3. แจกแจงเซตย่อยด้วยบิตมาสก์
  4. ลดพื้นที่ค้นหาอย่างชาญฉลาด
← กลับไปที่ Competitive Programming Academy