Najbliższa para punktów między dwoma zestawami, w 2D


11

Mam dwa zestawy punktów w płaszczyźnie dwuwymiarowej. Chcę znaleźć najbliższą parę punktów s , t taką, że s ∈ S , t ∈ T , a odległość euklidesowa między s , t jest tak mała, jak to możliwe. Jak skutecznie można to zrobić? Czy można tego dokonać w czasie O ( n log n ) , gdzie n = | S | + | T | ?S,Ts,ts∈St∈Ts,tO(nlog⁡n)n=|S|+|T|

Wiem, że jeśli mam podane jednolity zbiór , to jest możliwe, aby znaleźć najbliższą parę punktów s , s ' ∈ S w O ( n log n ) czasu przy użyciu standardowego algorytmu dziel i zwyciężaj . Jednak algorytm ten nie wydaje się uogólniać na przypadek dwóch zestawów, ponieważ nie ma związku między odległością między dwoma najbliższymi punktami w obrębie S lub T a odległością między dwoma najbliższymi punktami w tych zestawach.Ss,s′∈SO(nlog⁡n)ST

Myślałem o zapisaniu zbioru w drzewie k -d, a następnie dla każdego s ∈ S , używając zapytania najbliższego sąsiada, aby znaleźć najbliższy punkt w T do s . Jednak najgorszy możliwy czas działania może być tak zły, jak czas O ( n 2 ) . Istnieją wyniki mówiące, że jeśli punkty T są losowo rozmieszczone, to oczekiwany czas działania dla każdego zapytania wynosi O ( log n ) , więc uzyskalibyśmy algorytm o oczekiwanym czasie działania O ( n log n )Tks∈STsO(n2)TO(log⁡n)O(nlog⁡n) gdybyśmy mieli gwarancję, że punkty są losowo rozmieszczone - ale szukam algorytmu, który będzie działał dla dowolnej kolekcji punktów (niekoniecznie losowo rozmieszczonych).

Motywacja: wydajny algorytm byłby przydatny w przypadku tego drugiego pytania .

Odpowiedzi:


10

Tak, może to być czas . Budowanie diagramu Voronoi dla T . Następnie dla każdego punktu s ∈ S znajdź, w której komórce diagramu Voronoi jest zawarty. Środek tej komórki to punkt t ∈ T najbliższy s .O(nlog⁡n)Ts∈St∈Ts

Możesz zbudować diagram Voronoi w czasie , a każde zapytanie (znajdź komórkę zawierającą s ) można wykonać w czasie O ( log n ) , więc całkowity czas działania to czas O ( n log n ) .O(nlog⁡n)sO(log⁡n)O(nlog⁡n)


Fajne, znacznie prostsze niż to, co mogłem wymyślić :).
— aelguindy,

Niezłe podejście! Pomocne byłyby jednak linki, szczególnie po stronie zapytań. Mógłbym znaleźć stronę Wikipedii pokazującą, że ogólny problem lokalizacji punktu można rozwiązać w czasie , ale czy istnieje lepszy sposób na specjalny przypadek komórek Voronoi? Moje wyszukiwanie ujawniło tylko tę odpowiedź , co czyni ją O ( n ) . O(log⁡n)O(n)
— j_random_hacker

Tn=|S|+|T|O(n)

1
nO(n)≤6n

To wydaje się poprawne w przypadku tego pytania na temat wymiany matematyki.
— Albjenow

5

L1

dO(nlogd−1⁡n)

O(nlog⁡n)O(nlog2⁡n)

S,TS−δzTδzzδzδz


P2pmPPqmQQ

1
l

Link jest zepsuty :(
— Keerthana Gopalakrishnan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.