ฉันมีวิธีแก้ปัญหาซึ่งอาจดูเหมือนสับสนเล็กน้อย แต่ควรมีประสิทธิภาพมากกว่าการค้นหาแบบไร้เดียงสา :O(n2)
- ให้เป็นแกนระหว่างศูนย์ของมวลของและBvAB
- เรียงจุดในและตามแนวแกนนี้เรียงและเรียงลำดับตามลำดับส่งผลให้ในลำดับ , , ... ,และ , , ... , b_nABa0a1anb0b1bn
ส่วนที่เหลืออยู่ในรหัสหลอกเพื่อให้ชัดเจน:
d = infinity.
for j from 1 to n
if (b_1 - a_j) along v > d then break endif
for k from 1 to n
if (b_k - a_j) along v > d then
break
else
d = min( d , ||b_k - a_j|| )
endif
enddo
enddo
นั่นคือโดยการเรียงลำดับก่อนจุดพร้อมคุณสามารถกรองคู่ที่จะไม่ได้รับภายในของแต่ละอื่น ๆ ตั้งแต่พร้อมจะเป็น.vdbk−ajv≤∥bk−aj∥
ในกรณีที่แย่กว่านี้ยังคงเป็นแต่ถ้าแยกและได้ดีมันควรจะเร็วกว่านั้นมาก แต่ไม่ควรดีกว่าซึ่งจำเป็นต้องใช้ สำหรับการเรียงลำดับO(n2)ABO(nlogn)
ปรับปรุง
วิธีนี้ไม่ได้ถูกดึงออกมาจากหมวก มันเป็นกรณีพิเศษของสิ่งที่ฉันใช้ในการจำลองอนุภาคเพื่อค้นหาคู่ของอนุภาคทั้งหมดที่มีปฏิสัมพันธ์กับ binning อวกาศ การทำงานของตัวเองอธิบายปัญหาทั่วไปมากขึ้นที่นี่
สำหรับข้อเสนอแนะที่จะใช้อัลกอริทึม line-sweep ที่แก้ไขแม้ว่าจะง่าย ๆ โดยสังหรณ์ใจฉันไม่เชื่อว่านี่เป็นในเมื่อพิจารณาถึงชุดที่แยกจากกัน เช่นเดียวกันสำหรับอัลกอริทึมแบบสุ่มของ RabinO(nlogn)
ดูเหมือนว่าจะมีวรรณกรรมไม่มากที่เกี่ยวข้องกับปัญหาคู่ที่ใกล้ที่สุดในเซตที่แยกจากกัน แต่ฉันได้พบสิ่งนี้ซึ่งไม่ได้อ้างว่าอยู่ภายใต้และนี่ดูเหมือนจะไม่ เพื่อทำการอ้างสิทธิ์ใด ๆ เกี่ยวกับสิ่งใดO(n2)
อัลกอริทึมด้านบนสามารถมองเห็นได้ว่าเป็นตัวแปรของการกวาดเครื่องบินที่แนะนำในบทความแรก (Shan, Zhang และ Salzberg) แต่แทนที่จะใช้ -axis และไม่มีการเรียงลำดับแกนระหว่างชุดจะถูกใช้และชุดจะถูกสำรวจ ตามลำดับจากมากไปน้อย / จากน้อยไปมากx