Ich habe eine Lösung, die etwas kompliziert erscheint, aber effizienter sein sollte als die naive Brute-Force-Suche:O(n2)
- lassen sein die Achse zwischen den Mitten der Masse von und .vAB
- Sortieren Sie die Punkte in und entlang dieser Achse in absteigender bzw. aufsteigender Reihenfolge, was zu den Sequenzen , , ..., und , , ..., .ABa0a1anb0b1bn
Der Rest ist in Pseudocode, um es klarer zu machen:
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
Das heißt, indem Sie die Punkte entlang vorsortieren , können Sie Paare herausfiltern, die niemals innerhalb von voneinander liegen, da entlang immer.vdbk−ajv≤∥bk−aj∥
Im schlimmsten Fall ist dies immer noch , aber wenn und gut getrennt sind, sollte es viel schneller sein, aber nicht besser als , was erforderlich ist für die Sortierung.O(n2)ABO(nlogn)
Aktualisieren
Diese Lösung wird keineswegs aus dem Hut gezogen. Es ist ein Sonderfall dessen, was ich in Partikelsimulationen verwende, um alle interagierenden Partikelpaare mit räumlicher Gruppierung zu finden. Meine eigene Arbeit, die das allgemeinere Problem erklärt, ist hier .
Was den Vorschlag betrifft, einen modifizierten Line-Sweep-Algorithmus zu verwenden, bin ich, obwohl intuitiv einfach, nicht davon überzeugt, dass dies in wenn disjunkte Mengen berücksichtigt werden. Gleiches gilt für Rabins randomisierten Algorithmus.O(nlogn)
Es scheint nicht viel Literatur mit dem nächsten Paar Problem in disjunkte Mengen zu tun zu sein, aber ich habe festgestellt , das , was ist unter keinen Anspruch macht , und das , was nicht scheint Ansprüche über irgendetwas zu erheben.O(n2)
Der obige Algorithmus kann als eine Variante des in der ersten Veröffentlichung vorgeschlagenen Ebenen-Sweeps angesehen werden (Shan, Zhang und Salzberg). Anstatt jedoch die Achse und keine Sortierung zu verwenden, wird die Achse zwischen den Sätzen verwendet und die Sätze werden durchlaufen in absteigender / aufsteigender Reihenfolge.x