การแบ่งพื้นที่เป็น O (N ^ 2) เสมอในกรณีที่เลวร้ายที่สุดและนั่นคือความซับซ้อนของสารสนเทศ
แต่มีขั้นตอนวิธีการที่ทำงานในเส้นเวลา O (N) พวกเขาทั้งหมดขึ้นอยู่กับสายการกวาดบางประเภท
โดยทั่วไปคุณจะต้องจัดเรียงวัตถุของคุณด้วยพิกัดเดียว สมมุติว่า X. ถ้าคุณเรียงลำดับทุกครั้งก่อนการตรวจจับการชนความซับซ้อนจะเป็น O (N * logN) เคล็ดลับคือการจัดเรียงเฉพาะเมื่อคุณเพิ่มวัตถุในฉากและต่อมาเมื่อมีบางสิ่งในฉากเปลี่ยนไป การเรียงลำดับหลังการเคลื่อนไหวนั้นไม่สำคัญ ดูกระดาษเชื่อมโยงด้านล่างสำหรับอัลกอริทึมที่ใช้ในการเคลื่อนไหวและยังคงทำงานในเวลาเชิงเส้น
จากนั้นคุณกวาดจากซ้ายไปขวา ทุกครั้งที่บรรทัดการกวาดของคุณข้ามจุดเริ่มต้นของวัตถุคุณวางไว้ในรายการชั่วคราว ทุกครั้งที่สายการกวาดของคุณออกจากวัตถุคุณจะนำมันออกจากรายการ คุณพิจารณาการชนภายในรายการชั่วคราวนี้เท่านั้น
เส้นกวาดไร้เดียงสาคือ O (N ^ 2) ในกรณีที่เลวร้ายที่สุดเช่นกัน (คุณทำให้วัตถุทั้งหมดขยายแผนที่ทั้งหมดจากซ้ายไปขวา) แต่คุณสามารถทำให้เป็น O (N) โดยทำให้มันฉลาดขึ้น (ดูลิงค์ด้านล่าง) อัลกอริทึมที่ดีจริงๆจะค่อนข้างซับซ้อน
นี่เป็นไดอะแกรมอย่างง่ายเกี่ยวกับการทำงานของสายการกวาด:
เส้นกวาดจากซ้ายไปขวา วัตถุจะถูกจัดเรียงตามพิกัด X
- กรณีที่หนึ่ง: ตรวจสอบสองวัตถุแรก ไม่มีอะไรอื่นที่สำคัญ
- กรณีที่สอง: วัตถุแรกถูกตรวจสอบและหายไปจากรายการ มีการตรวจสอบสองและสาม
- กรณีที่สาม: แม้ว่าวัตถุนั้นจะชนกัน แต่เราไม่ได้ตรวจสอบ
- กรณีที่สี่: เพราะเราตรวจสอบในกรณีนี้!
อัลกอริทึมเช่นนี้มีความซับซ้อน O (C * N) = O (N)
ที่มา: หลักสูตรเรขาคณิตสองปี
ในการตรวจจับการชนกันโดยทั่วไปเรียกว่าSweep and Pruneแต่ตระกูล algortithms ของ sweep line นั้นมีประโยชน์ในหลาย ๆ ด้าน
การอ่านที่แนะนำเพิ่มเติมที่ฉันเชื่อว่าอยู่นอกขอบเขตของคำถามนี้ แต่ก็น่าสนใจ แต่: วิธีการกวาดและกำจัดลูกพรุนขนาดใหญ่ที่มีประสิทธิภาพด้วยการแทรกและกำจัด AABB - บทความนี้นำเสนอขั้นตอนวิธีการกวาดและลูกพรุนที่ปรับปรุง ) การเรียงลำดับที่คำนึงถึงความเคลื่อนไหว Algorigthm นำเสนอในกระดาษทำงานในเวลาเชิงเส้น
ตอนนี้ทราบว่านี้เป็นขั้นตอนวิธีการที่ดีที่สุดในทางทฤษฎี ไม่ได้หมายความว่ามันถูกใช้ ในทางปฏิบัติ O (N ^ 2) อัลกอริทึมที่มีการแบ่งพื้นที่จะมีความเร็วประสิทธิภาพที่ดีขึ้นในกรณีทั่วไป (ใกล้กับ O (N)) และความต้องการพิเศษบางอย่างสำหรับหน่วยความจำ นี่เป็นเพราะค่าคงที่ C ใน O (C * N) อาจสูงมาก! เนื่องจากเรามักจะมีหน่วยความจำเพียงพอและกรณีทั่วไปมีวัตถุที่แพร่กระจายอย่างสม่ำเสมอในพื้นที่ - อัลกอริทึมดังกล่าวจะทำงานได้ดีขึ้น แต่O (N) คือคำตอบของคำถามต้นฉบับ