ทีมของคุณได้รับมอบหมายให้พัฒนาฐานข้อมูลเอกสารที่ชาร์ดในหน่วยความจำ ปริมาณงานทั่วไปคือการเลือกเอกสาร N อันดับสูงสุดที่จัดเรียงตามฟิลด์ตัวเลขตามอำเภอใจ (ไม่ได้จัดทำดัชนี) จากคอลเล็กชันขนาด M (โดยปกติคือ N < 100 << M) ปริมาณงานทั่วไปที่น้อยลงเล็กน้อยคือการเลือก N อันดับบนสุดหลังจากข้ามเอกสาร S อันดับต้น ๆ (S ~ N)
เสนออัลกอริทึมเพื่อดำเนินการค้นหาดังกล่าวอย่างมีประสิทธิภาพ ประเมินความซับซ้อนในการคำนวณโดยใช้สัญกรณ์ O ขนาดใหญ่ในกรณีเฉลี่ยและสถานการณ์กรณีที่เลวร้ายที่สุด
การวิเคราะห์โซลูชัน (วิดีโอ)
เริ่มเวลา 34:50 น. เพียง 6 นาที:
การวิเคราะห์โซลูชัน (ข้อความ)
โซลูชัน Surface: จัดเรียงเอกสารทั้งหมด (เช่น กับ Quicksort) จากนั้นนำเอกสาร N+S ในกรณีนี้ ความซับซ้อนของการคัดแยกอยู่ที่ค่าเฉลี่ย O(M lg M) ที่แย่ที่สุด O(M2)
เห็นได้ชัดว่าการจัดเรียงเอกสาร M ทั้งหมดแล้วคัดมาเพียงส่วนเล็กๆ นั้นไม่มีประสิทธิภาพ เพื่อไม่ให้จัดเรียงเอกสารทั้งหมดอัลกอริทึมจึงเหมาะสม เลือกอย่างรวดเร็วซึ่งจะเลือก N + S ของเอกสารที่ต้องการ (สามารถจัดเรียงตามอัลกอริทึมใดก็ได้) ในกรณีนี้ ความซับซ้อนจะลดลงเหลือ O(M) โดยเฉลี่ย ในขณะที่กรณีที่เลวร้ายที่สุดจะยังคงเหมือนเดิม
อย่างไรก็ตาม คุณสามารถทำได้อย่างมีประสิทธิภาพยิ่งขึ้น - ใช้อัลกอริทึม การสตรีมไบนารีฮีป. ในกรณีนี้ เอกสาร N+S แรกจะถูกเพิ่มไปยัง min- หรือ max-heap (ขึ้นอยู่กับทิศทางการจัดเรียง) จากนั้นเอกสารถัดไปแต่ละรายการจะถูกเปรียบเทียบกับรูทของทรี ซึ่งมีเอกสารขั้นต่ำหรือสูงสุดในปัจจุบัน และเพิ่มเข้าไปในต้นไม้หากจำเป็น . ในกรณีนี้ ความซับซ้อนในกรณีที่เลวร้ายที่สุด เมื่อคุณต้องสร้างแผนผังใหม่อย่างต่อเนื่องคือ O (M lg M) ความซับซ้อนโดยเฉลี่ยคือ O (M) เช่นเดียวกับการเลือกด่วน
วิธีแก้ปัญหาดังกล่าวจะไม่ทำให้นักคณิตศาสตร์ประหลาดใจเลยที่ยังจำได้ว่าการหมุนเป็นองค์ประกอบของสมมาตรตามแนวแกนสองเส้น อย่างไรก็ตาม การเปลี่ยนแปลงโดยทั่วไปไม่ใช่เรื่องเล็กน้อยสำหรับการเปลี่ยนแปลงทีละตำแหน่ง แต่โดยตำแหน่ง K < N (เขียนในความคิดเห็นว่าเป็นอย่างไร)