Mam rozwiązanie, które może wydawać się nieco skomplikowane, ale powinno być bardziej wydajne niż naiwne wyszukiwanie :O(n2)
- niech być oś pomiędzy środkami ciężkości i .vAB
- Posortuj punkty i wzdłuż tej osi odpowiednio w porządku malejącym i rosnącym, uzyskując sekwencje , , ..., i , , ..., .ABa0a1anb0b1bn
Reszta jest w pseudo-kodzie, aby było jaśniej:
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
To znaczy, wstępnie sortując punkty wzdłuż , możesz odfiltrować pary, które nigdy nie będą w odległości od siebie, ponieważ wzdłuż zawsze będzie.vdbk−ajv≤∥bk−aj∥
W najgorszym przypadku jest to nadal , ale jeśli i są dobrze oddzielone, powinno być znacznie szybsze, ale nie lepsze niż , co jest wymagane do sortowania.O(n2)ABO(nlogn)
Aktualizacja
To rozwiązanie w żadnym wypadku nie jest wyciągane z kapelusza. Jest to szczególny przypadek tego, czego używam w symulacjach cząstek, aby znaleźć wszystkie oddziałujące pary cząstek z przestrzennym binowaniem. Moja własna praca wyjaśniająca bardziej ogólny problem jest tutaj .
Jeśli chodzi o sugestię użycia zmodyfikowanego algorytmu przesuwania linii, chociaż intuicyjnie prosty, nie jestem przekonany, że jest to w gdy rozważane są zestawy rozłączne. To samo dotyczy losowego algorytmu Rabina.O(nlogn)
Wydaje się, że nie ma zbyt wiele literatury dotyczącej problemu najbliższych par w rozłącznych zestawach, ale znalazłem to , co nie rości sobie prawa do bycia pod , i to , co nie wydaje się zgłaszać jakiekolwiek roszczenia.O(n2)
Powyższy algorytm może być postrzegany jako wariant przemiatania płaszczyzny zaproponowany w pierwszym artykule (Shan, Zhang i Salzberg), ale zamiast używać osi i braku sortowania, oś między zestawami jest używana, a zestawy są trawersowane w porządku malejącym / rosnącym.x