Tôi có một giải pháp có vẻ hơi phức tạp, nhưng sẽ hiệu quả hơn so với tìm kiếm vũ phu ngây thơ :O(n2)
- hãy là trục giữa trung tâm của khối lượng của A và B .vAB
- Sắp xếp các điểm theo và B dọc theo trục này theo thứ tự giảm dần và tăng dần, dẫn đến các chuỗi a 0 , a 1 , ..., a n và b 0 , b 1 , ..., b n .ABa0a1anb0b1bn
Phần còn lại là mã giả để làm cho nó rõ ràng hơn:
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∥
Trong trường hợp xấu hơn, đây vẫn là , nhưng nếu và tách biệt tốt, thì nó sẽ nhanh hơn thế nhiều, nhưng không tốt hơn , được yêu cầu để phân loại.O(n2)ABO(nlogn)
Cập nhật
Giải pháp này là không có nghĩa là kéo ra khỏi một chiếc mũ. Đây là trường hợp đặc biệt của những gì tôi sử dụng trong mô phỏng hạt để tìm tất cả các cặp hạt tương tác với quá trình tạo không gian. Công việc của riêng tôi giải thích vấn đề chung hơn là ở đây .
Đối với đề xuất sử dụng thuật toán quét dòng đã sửa đổi, mặc dù đơn giản theo trực giác, tôi không tin rằng đây là trong khi các bộ tách rời được xem xét. Điều tương tự cũng xảy ra với thuật toán ngẫu nhiên của Rabin.O(nlogn)
Dường như không có nhiều tài liệu liên quan đến vấn đề cặp gần nhất trong các tập hợp rời rạc, nhưng tôi đã tìm thấy điều này , điều này không khẳng định rằng nó nằm dưới , và điều này , dường như không để đưa ra bất kỳ tuyên bố về bất cứ điều gì.O(n2)
Thuật toán ở trên có thể được xem là một biến thể của quét mặt phẳng được đề xuất trong bài báo đầu tiên (Shan, Zhang và Salzberg), nhưng thay vì sử dụng -axis và không sắp xếp, trục giữa các bộ được sử dụng và các bộ được dịch chuyển theo thứ tự giảm dần / tăng dần.x