Теоретический алгоритм поиска двух ближайших точек на окружности за O(n)

Учитывая n точек на контуре единичного круга, я хочу вычислить ближайшие 2 точки.

Точки не упорядочены, и мне нужно сделать это за O (n) (поэтому я не могу сортировать их по часовой стрелке...)

Когда-то я знал решение для этого, но забыл его... решение включает в себя хеширование и разбиение круга на n или более фрагментов.

Если вы нашли алгоритм для расчета только расстояния, а не конкретных точек, этого будет достаточно.


person Oren    schedule 16.09.2010    source источник


Ответы (2)


Вот решение, которое претендует на O(n log log n) для нахождения ближайшей пары точек на линии. Это тривиальное преобразование из вашей задачи - каждая точка (x, y) на единичной окружности отображается в линейную координату x' в отрезке [0,2pi), где x' = atan2(y,x). Идея, после того как вы преобразовали ее в одномерную задачу, примерно состоит в том, чтобы начать хэшировать координаты x в сегменты, перераспределяя большие сегменты на сегменты меньшего размера, пока не останется не более одной точки на сегмент, затем пройтись по списку и найти ближайшая пара. (И у вас будет одна дополнительная проверка, чтобы увидеть, образуют ли точки с минимальной и максимальной координатами x' еще более тесную пару, чем линейный минимум.)

person Jim Lewis    schedule 16.09.2010
comment
Я не совсем понял вычисление O(n log log n), но в этом я вам доверяю. Во всяком случае, это не решение O (n). Можете ли вы сделать тот факт, что мы смотрим на круг, преимуществом, а не недостатком? - person Oren; 17.09.2010
comment
С другой стороны, если бы существовал алгоритм, решающий мою задачу за O(n), то я мог бы отобразить любую задачу с ближайшими парами на линии в половину круга и решить ее за O(n) вместо O(n log log н)... - person Oren; 17.09.2010

Отсортируйте их по углу, поместив в ячейки (binsort, O(n)); выберите количество ячеек того же порядка, что и количество точек. Затем пройдите и найдите ближайшую пару, повторяя процесс в ячейке, если в нее попадает более одной точки.

person Rex Kerr    schedule 16.09.2010
comment
Binsort основан на предположении, что точки были выбраны случайным образом, верно? Я не уверен, что могу это предположить, но я спрошу завтра. - person Oren; 17.09.2010
comment
@Oren - Вы правы в предположении. Я мог бы дать вам набор точек, отстоящих друг от друга с экспоненциально уменьшающимся расстоянием, и вы не справитесь с этим лучше, чем O(N log N). Мое предложение такое же, как и предложение @Jim Lewis, на которое ссылается; Я не знаю, как они получают O(N log log N); в случайном случае вы ожидаете уменьшения количества точек для проверки на (e-2)/e за O(N) шага (если вы выберете # бинов = # точек (свойство распределения Пуассона)), и геометрический ряд этого равно 1/(1-e/(e-2)) = (e-2)/2, что является постоянным коэффициентом. - person Rex Kerr; 17.09.2010