Najkrótsza odległość między punktem A i punktem B


9

Biorąc pod uwagę dwa zestawy i każdy zawierający rozłącznych punktów na płaszczyźnie, oblicz najkrótszą odległość między punktem w a punktem w , tj. .ABnABmin { dist(p,q) | pAqB }

Nie jestem pewien, czy mam rację, ale ten problem jest bardzo podobny do problemów, które można rozwiązać za pomocą programowania liniowego w geometrii obliczeniowej. Jednak redukcja do LP nie jest prosta. Również mój problem wygląda na znalezienie najcieńszego punktu między dwoma zestawami punktów, które oczywiście można rozwiązać za pomocą LP w O(n) w przestrzeni dwuwymiarowej.


4
Jakie jest tutaj pytanie?
Raphael


Nie jestem ekspertem, ale zwykle w uczeniu maszynowym, gdzie te punkty są danymi, zestawy zachowują się przez większość czasu i są zgrupowane razem, więc algorytmy takie jak sugerowane przez @Pedro działają dobrze.
chazisop,

3
„które oczywiście można rozwiązać LP w O (n) w przestrzeni dwuwymiarowej” - zastanawiam się, co skłoniło to stwierdzenie. „Programowanie liniowe” zasadniczo nie jest możliwe do rozwiązania w czasie liniowym; „liniowy” odnosi się do czegoś innego. Czy LP ma specjalną formę?
Raphael

Odpowiedzi:


5

Mam rozwiązanie, które może wydawać się nieco skomplikowane, ale powinno być bardziej wydajne niż naiwne wyszukiwanie :O(n2)

  1. niech być oś pomiędzy środkami ciężkości i .vAB
  2. 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.vdbkajvbkaj

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


2
@Pedro: Niestety nie komentowałem wcześniej (brak czasu w tym czasie). Powodem, dla którego oceniłem twoją odpowiedź, było to, że była to zła odpowiedź i nie powinna być na szczycie. Jest to właściwie dobrze znany problem w geometrii obliczeniowej z najgorszym przypadkiem O (n log n). Dobra odpowiedź wskazywałaby na znany problem (może z odniesieniem) i wspólne rozwiązania, które obejmują: używanie drzew kd i testowanie elementarne, algorytmy wymiatania itp. Ogólnym pomysłem powinno być wstępne przetwarzanie w uporządkowanej strukturze i wykorzystanie tego . Spójrz na przypadek 1D - bardziej oczywisty O (n log n) tam.
ex0du5

2
@ ex0du5: Brzmi to tak, jakbyś opublikował własną odpowiedź! Zauważ, że „jest lepsza odpowiedź” zwykle nie jest dobrym powodem do głosowania w dół; środek ten powinien być zarezerwowany dla niewłaściwych, spamu i bardzo źle sformatowanych odpowiedzi. Pedro nie jest ani jedno, ani drugie. Zobacz także tutaj, aby zobaczyć, ile myśli niektórzy ludzie powinni przemyśleć przed głosowaniem negatywnym.
Raphael

1
@Raphael: Nie odpowiedziałem, ponieważ była jedna uczciwa odpowiedź i nie miałem czasu na wyszukiwanie referencji. Jeśli chodzi o twoje referencje na temat głosowania, to okropny algorytm dla tych stron! Studenci CS szczególnie powinni zrozumieć, jak ważne jest, aby nie stracić celu formalizmu. Celem głosowania jest przeniesienie odpowiedzi do rankingu, który poprowadzi późniejszych uczniów tego samego problemu do najbardziej przydatnych odpowiedzi. Mój algorytm do głosowania to robi. Ten algo: oczywiście nie. Można to omówić na meta, jeśli chcesz, ale myślę, że jako dorośli powinniśmy korzystać z naszych mocy na dobre.
ex0du5

1
@ ex0du5: Wygląda na to, że masz teraz trochę czasu. Czy możesz rzeczywiście wykazać, że to wystąpienie jest „dobrze znanym problemem w najgorszym przypadku ”? O(nlogn)
Pedro

1
@ ex0du5: W rzeczywistości wyszukiwanie najbliższego sąsiada, np. przy użyciu drzew kd , ma tylko średnią złożoność O (logn) . Wracamy do pierwszego.
Pedro

4

Możesz dostosować algorytm „linii najbliższej pary” , którym jest .O(nlogn)

Jedyne, co musisz zrobić, to zignorować pary należące do tego samego zestawu.

Edycja: W rzeczywistości nie jest to proste (ani nawet możliwe), jak opisałem. Zobacz komentarze do dyskusji.


2
Tylko uwaga, można również dostosować klasyczny algorytm dzielenia i zdobywania dla najbliższych par, który również działa w ; patrz także Wikipedia . O(nlogn)
rizwanhudda

1
Aby uzyskać losowy algorytm czasu liniowego, zobacz na przykład Rabin Flips a Coin na blogu Liptona.
Juho,

3
Czy mógłbyś być bardziej konkretny na temat tego, jak zaimplementowałbyś to dla rozłącznych zestawów, szczególnie w odniesieniu do utrzymania ograniczenia ? O(nlogn)
Pedro

-1 za niepoprawność. Algorytm zamiany najbliższej pary linii, który łączysz, opiera się na posortowanym zestawie zawierającym elementy , ale w przypadku zestawów rozłącznych ten zestaw zaczyna się od elementów, więc nie jest już w , w przynajmniej nie w najgorszym przypadku. O(1)nO(nlogn)
Pedro

1
@Pedro: Dlaczego miałby być większy? Jeśli już, zbiór aktualnych punktów kandydujących powinien się zmniejszyć.
Raphael

4

Ideą w takich problemach jest stworzenie uporządkowanej struktury z jednego z zestawów, który umożliwia wydajne zapytania Najbliższego sąsiada. Klasyczny artykuł, który przedstawiał strukturę zapytań O (log n) dla dowolnego wymiaru, brzmiał:

Shamos i Hoey o rozwiązaniach Voronoi

Od tego czasu powstało wiele innych partycji kosmicznych opartych na pomysłach teselacji Delauney, które przekładają się również na różne opisy przeciągnięć podprzestrzeni. Zauważ, że metoda Voronoi również podlegałaby ogólnemu opisowi podziału i podboju ze względu na jej podział na płaszczyzny, który powoduje etap budowy O (n log n).

Podstawowym rozwiązaniem tego problemu jest:

  1. Weź zestaw A i zbuduj efektywną strukturę zapytań Najbliższego sąsiada do wyboru. Ten etap budowy to O (n log n) [patrz twierdzenie 4].
  2. Dla każdego elementu w B zapytaj strukturę A o najbliższego sąsiada. Każde zapytanie ma wartość O (log n) [patrz twierdzenie 15, ustalony wymiar], więc całkowity czas zapytania dla wszystkich punktów w B wynosi O (n log n).
  3. Po uzyskaniu wyniku dla najbliższego punktu A do każdego B, umieść go w strukturze uporządkowanej na odległość. To jest O (log n) wstaw każdy wynik lub O (n log n) dla wszystkich.
  4. Po obejrzeniu wszystkich B możesz szybko (O (1)) uzyskać punkt B w uporządkowanej strukturze z najmniejszą odległością sąsiadującą do punktu w A.

Jak widać patrząc na złożoność każdego kroku, całkowita złożoność wynosi O (n log n). Dla współczesnego czytelnika, który nie patrzy na klasyczne artykuły, jest to omówione w wielu książkach z algorytmami, np. „Podręcznik projektowania algorytmów” Skieny.


1
„Na przykład rozwiązanie Artium można zapisać w tej formie i jest ono w pełni aktualne”. - cóż, to, co tu proponujesz, nie jest już (czystym) algorytmem linii zamiatania, więc nie wiem o tym.
Raphael

@Raphael: Jasne, że tak. Algorytmy Sweepline przetwarzają wstępnie punkty w uporządkowaną strukturę, tak jak opisano tutaj. Podłączyłem nawet do Algorytmu Fortuny pod jego odpowiedzią, która pokazuje, że algorytm Sweepline jest tylko przykładem algorytmu Voronoi. Powodem, dla którego utrzymałem ogólne rozwiązanie struktury zapytań, jest to, że opracowano w tym celu wiele mechanizmów geometrycznych.
ex0du5

Nie potrzebujesz określonego porządku podczas iteracji nad , podczas gdy kolejność jest niezbędna dla (wielu / wszystkich?) Algorytmów linii prostej (stąd nazwa, jak sądzę). B
Raphael

1

Nie jestem pewien, czy mam rację, ale ten problem jest bardzo podobny do problemów, które można rozwiązać za pomocą programowania liniowego w geometrii obliczeniowej. Jednak redukcja do LP nie jest prosta. Również mój problem wygląda na znalezienie najcieńszego punktu pomiędzy dwoma zestawami punktów, które oczywiście można rozwiązać za pomocą LP w przestrzeni dwuwymiarowej.

Dolna granica tego problemu to w algebraicznym modelu drzewa decyzyjnego. Podam tutaj przybliżony szkic tego dowodu.O(nlogn)

Zmniejszymy wystąpienie problemu odróżnienia elementu E do C.

  • Dane wejściowe do E: S={a1,a2,a3,...,an}
  • Niech > 0 będzie małą frakcjąϵ
  • A = ,{(ai,0):1in}B={(ai+ϵ):1in}
  • Teraz, jeśli uda nam się znaleźć najkrótszą odległość (d) między zbiorami A i B. Możemy rozwiązać problem odróżnienia elementu w dodatkowym czasie w następujący sposób O(n)
    • Zestaw ma duplikat wtedy i tylko wtedy, gdy d =Sϵ

Wiemy, że dolna granica środowiska wykonawczego w celu podjęcia decyzji o problemie z odrębnością elementów to . Dlatego redukcja dolnej granicy dotyczy również naszego problemu.O(nlogn)

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.