Следующие упражнения были розданы студентам, которых я курирую:
Учитывая точек на плоскости, разработайте алгоритм, который находит пару точек, расстояние которых минимально среди всех пар точек. Алгоритм должен работать за время 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
(возможно, с предварительной обработкой в линейное время)?
и
.
Предположим, что конечно. Можно ли найти с минимальным расстоянием от за (амортизированное) время ? (Вы можете предположить, что строится, добавляя исследуемые точки одну за другой.)
источник
Ответы:
Невозможно решить проблему менее чем за времени в стандартных моделях, например, с использованием алгебраических деревьев решений. Это следует из работ Яо и Бен-Ора, которые показывают, что в этой модели невозможно определить, являются ли все наборы из входных чисел различными или нет (см. Http://people.bath.ac.uk/masnnv /Teaching/AAlg11_8.pdf ). В случае вашей проблемы, представьте, что все они находятся на реальной линии. Если две точки совпадают, то ваши выходные данные будут двумя точками с нулевым расстоянием, а в противном случае - нет, поэтому решение вашей проблемы также решит проблему РАЗЛИЧНЫХ ЧИСЕЛ. Если вы хотите предположить, что все ваши очки разные, то просто добавьте вcnlogn n iϵ xi входные данные задачи DISTINCT NUMBERS, в этом случае, если ваш вывод не больше , то числа не все различны. (Хотя в этом случае вы должны использовать версию обещания, в которой разница между любыми двумя различными числами составляет не менее , но я думаю, что это же доказательство работает, чтобы показать, что вам также нужен в этом дело.)nϵ 2nϵ Ω(nlogn)
источник
Рабин использует рандомизированный линейный алгоритм ожидаемого времени; например, Рабин переворачивает монету в блоге Липтона.
источник
Насколько я понимаю вопрос 2, алгоритм Рабина также дает своего рода ответ на этот вопрос. На каждом временном шаге структура данных представляет собой сетку с шириной ячейки, меньшей наименьшего расстояния между парами точек, видимых до сих пор, деленного на (так, чтобы ни одна ячейка не содержала более одной точки). Чтобы ответить на вопрос в вопросе 2, вам нужно только сопоставить с ячейкой в сетке и посмотреть на постоянное количество ячеек вокруг нее. Согласно анализу алгоритма, если входной набор точек проверяется в случайном порядке, то амортизированное время обновления для сетки составляет на новую ожидаемую точку. рO(1)2–√ p O(1)
источник