jest zbiorem punktów na płaszczyźnie. Losowy punkt x ∉ S jest podany na tej samej płaszczyźnie. Zadanie to rozwiązać wszystkie y ∈ S przez euklidesową odległość pomiędzy x i y .
Podejście no-mózg jest obliczenie odległości między i Y dla wszystkich y ∈ S , a następnie posortować je za pomocą dowolnego szybki algorytm.
Czy istnieje sposób na przechowywanie lub wstępne przetwarzanie aby proces sortowania stał się szybszy?
cg.comp-geom
sorting
Alex K.
źródło
źródło
Odpowiedzi:
Rozwiązanie 1: Znajdź prostopadłe dwusieczne między parami punktów i konstruuj układ tych linii. Układ ma Θ ( n 4 ) komórek, w których porządek sortowania jest stały. Zbuduj więc strukturę danych lokalizacji punktu dla aranżacji i udekoruj każdą komórkę posortowaną kolejnością, która ma zostać zwrócona dla punktów w tej komórce. Posortowane zamówienia między sąsiednimi komórkami różnią się tylko pojedynczą transpozycją, więc można użyć trwałej struktury danych, aby umożliwić reprezentacjom tych posortowanych zamówień współdzielenie przestrzeni. Całkowita przestrzeń wynosi O ( n 4 ), a czas zapytania wynosi OΘ(n2) Θ(n4) O(n4) .O(logn)
Rozwiązanie 2: Wybierz losową próbkę tych samych prostopadłych dwusiecznych, skonstruuj ich układ i podziel każdą komórkę aranżacyjną pionowymi segmentami linii przez każde skrzyżowanie dwóch próbkowanych linii. Powstały podział ma Θ ( n 2 ) komórek, z których każda z dużym prawdopodobieństwem jest przecinana przez O ( n ) niespróbkowanych dwusiecznych. Udekoruj każdą komórkę partycji za pomocą prawidłowego uporządkowania punktów widzianych z pewnego x wewnątrz komórki. Całkowita przestrzeń wynosi O ( n 3 ) .Θ(n) Θ(n2) O(n) O(n3)
Teraz, aby wykonać zapytanie, zlokalizuj punkt zapytania na partycji, wyszukaj kolejność przechowywaną w komórce partycji i użyj algorytmu sortowania porównawczego drzewa kartezjańskiego Levcopoulos i Petersson (1989), zaczynając od tej przechowywanej kolejności. Czas dla tego kroku jest proporcjonalny do gdzie k i jest liczbą punktów, które są poza kolejnością względem punktu y i . Ale ∑ k i to O ( n ) (każdy niespróbkowany dwusieczny powoduje co najwyżej jedną parę punktów poza kolejnością), więc czas zapytania∑iO(1+logki) kja yja ∑ kja O ( n ) to także O ( n ) .∑jaO ( 1 + logkja) O ( n )
źródło
Prawdopodobnie nie będziesz w stanie uciec od czasu w jakikolwiek sposób; nawet regiony obliczania wstępnego odpowiadające wszystkim możliwym porządkom sortowania mogłyby (wydaje mi się) dawać regiony O ( n ! ) , a zatem znalezienie „twojego” regionu dowolną znaczącą techniką wyszukiwania zajmie O ( log ( n ! ) ) = O ( n log ( n ) ) czas. ( EDYCJA:nlog(n) O(n!) O(log(n!))=O(nlog(n)) to jest absolutnie złe; zobacz doskonałą odpowiedź Davida Eppsteina, aby uzyskać więcej informacji!) Z drugiej strony jeden użyteczny sposób na zmniejszenie złożoności - szczególnie, jeśli nie potrzebujesz od razu całego rodzaju, ale po prostu musisz mieć możliwość losowego wyciągnięcia -najbliższego w locie - może odbywać się za pomocą diagramów Voronoi wyższego rzędu: rozszerzenia standardowej komórki Voronoi, które akceptują nie tylko najbliższego sąsiada, ale drugiego najbliższego itd. Artykuł Franka Dehne'a na temat wyszukiwania najbliższego sąsiada, http: //people.scs .carleton.ca / ~ dehne / publications / 2-02.pdf wydaje się być kanonicznym odniesieniem; jego strona główna pod adresem http://www.dehne.carleton.ca/publications zawiera wiele innych artykułów na temat diagramów Voronoi, które mogą być przydatne.k
źródło