Следующие упражнения были розданы студентам, которых я курирую:
Учитывая точек на плоскости, разработайте алгоритм, который находит пару точек, расстояние которых минимально среди всех пар точек. Алгоритм должен работать за время o ( n 2 ) .
Существует (относительно) простой алгоритм «разделяй и властвуй», который решает задачу за время .
Вопрос 1 : Существует ли алгоритм, который решает данную проблему точно в наихудший момент времени ?
То, что заставило меня заподозрить, что это может быть возможным, - это результат, который я помню в каком-то разговоре (ссылка приветствуется). В нем говорилось о том, что не более чем постоянное число точек может быть расположено в плоскости вокруг некоторой точки p внутри окружности радиуса r ∈ R , где r минимальное расстояние между любыми двумя из участвующих точек , Я думаю, что с = 7 , точки, образующие равносторонний шестиугольник с р в центре (в крайнем случае).
В этом случае следующий алгоритм должен решить их проблему за шагов.
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
Обратите внимание, что это (утверждается, что) в линейном времени, потому что только постоянное количество точек r
может быть не дальше, чем m
от p
(при условии выше утверждение); только эти точки должны быть исследованы для нахождения нового минимума. Конечно, есть подвох; Как вы реализуете nextNeighbour
(возможно, с предварительной обработкой в линейное время)?
и
.
Предположим, что конечно. Можно ли найти с минимальным расстоянием от за (амортизированное) время ? (Вы можете предположить, что строится, добавляя исследуемые точки одну за другой.)