Studenci, których nadzoruję, otrzymali następujące ćwiczenie:
Biorąc pod uwagę punktów na płaszczyźnie, opracuj algorytm, który znajdzie parę punktów, których odległość jest minimalna wśród wszystkich par punktów. Algorytm powinien działać w czasie .o ( N 2 )
Istnieje (stosunkowo) prosty algorytm dzielenia i zdobywania, który rozwiązuje zadanie w czasie .
Pytanie 1 : Czy istnieje algorytm, który rozwiązuje dany problem dokładnie w najgorszym przypadku ?
Podejrzewałem, że może to być możliwe, wynik, który pamiętam z niektórych wystąpień (docenienie). Stwierdzono, że coś wzdłuż linii tego nie więcej niż stała liczba punktów może być ułożona w płaszczyźnie wokół jakiegoś punktu wewnątrz okręgu o promieniu , z minimalna odległość między dowolnymi dwoma zaangażowanymi punktami. Myślę , punkty tworzących sześciokąt równoboczny o w środku (w przypadku ekstremalnych). p r ∈ R r c = 7 p
W takim przypadku następujący algorytm powinien rozwiązać problem w krokach.
fun mindist [] | p::[] = INFINITY
| mindist p1::p1::[] = dist(P[0], P[1])
| mindist p::r = let m = mindist(r) in
min(m, nextNeighbour(p, r, m))
end
Zauważ, że jest (osiągając) w czasie liniowym, ponieważ tylko liczba stała punktów r
może być farer z dala od m
z p
(zakładając, że powyższe oświadczenie); tylko te punkty muszą zostać zbadane w celu znalezienia nowego minimum. Oczywiście jest pewien haczyk; jak wdrażasz nextNeighbour
(być może z przetwarzaniem wstępnym w czasie liniowym)?
Pytanie 2 : Niech zbiór punktów i punkt . Niech przy pomocyp ∉ R m ∈ R
i
.
Załóżmy, że jest skończony. Czy można znaleźć przy minimalnej odległości od w (zamortyzowanym) czasie ? (Możesz założyć, że jest konstruowane przez dodawanie badanych punktów jeden po drugim.)