Сортировка по евклидовому расстоянию


17

- это множество точек на плоскости. Случайная точка x S задается на той же плоскости. Задача состоит в том, чтобы отсортировать все y S по евклидову расстоянию между x и y .SxSySxy

Бездумный подход состоит в том, чтобы вычислить расстояния между и y для всех y S, а затем отсортировать их, используя любой быстрый алгоритм.xyyS

Есть ли способ сохранить или предварительно обработать чтобы процесс сортировки стал быстрее?S


1
Вы можете рассмотреть сетку соответствующего размера и групповые точки по соответствующему квадрату (используя, скажем, хэш-таблицу). Тогда для определенных пар квадратов вы можете сделать вывод, что все точки одного квадрата находятся дальше от чем все точки другого квадрата. На практике это может помочь, я думаю. x
Ильяраз

«Безмозглый подход», который вы заявили, работает за время O (n log n), где n - это количество точек в S, которое, как мне кажется, довольно быстрое на практике. Вы хотите исключить коэффициент логарифмирования или что-то еще, например внешнюю сортировку ?
Tsuyoshi Ito

Дело в том, что у меня есть практически неограниченное время для подготовки набора баллов, но время для их сортировки очень ограничено. Тем не менее, приветствуется любое ускорение стандартной сортировки - даже если оно такое же O (n log n), но быстрее в худшем случае (или в лучшем случае, или как угодно).
Алекс К.

Например, если я храню S как двумерное дерево, я могу найти одного ближайшего соседа за O (log n). Может быть, есть аналогичное решение для моей задачи. Я не большой специалист по структурам пространственных данных - а их так много - я мог бы легко пропустить это.
Алекс К.

Ответы:


13

Решение 1. Найдите перпендикулярные биссектрисы между парами точек и постройте расположение этих прямых. Компоновка имеет Θ ( n 4 ) ячеек, в которых отсортированный порядок постоянен. Поэтому создайте структуру данных местоположения точек для расположения и украсьте каждую ячейку отсортированным порядком, который должен быть возвращен для точек в этой ячейке. Сортированные порядки между соседними ячейками различаются только в одном транспонировании, поэтому вы можете использовать постоянную структуру данных, чтобы представления этих отсортированных порядков могли совместно использовать пространство. Общее пространство O ( n 4 ) и время запроса OΘ(n2)Θ(N4)О(N4) .О(журналN)

Решение 2: Выберите случайную выборку из этих же перпендикулярных биссектрис, построите их расположение и разделите каждую ячейку расположения вертикальными отрезками, проходящими через каждое пересечение двух выбранных линий. Результирующее разбиение имеет Θ ( n 2 ) ячеек, каждая из которых с высокой вероятностью пересекается O ( n ) несэмплированными биссектрисами. Украсьте каждую ячейку раздела с помощью правильного отсортированного порядка точек, если смотреть с некоторого x внутри ячейки. Общее пространство O ( n 3 ) .Θ(N)Θ(N2)О(N)О(N3)

Теперь, чтобы выполнить запрос, найдите точку запроса в разделе, найдите порядок, сохраненный в ячейке раздела, и используйте алгоритм сортировки сравнения декартовых деревьев Levcopoulos & Petersson (1989), начиная с этого сохраненного порядка. Время для этого шага пропорционально где k i - количество точек, которые не соответствуют порядку точки y i . Но Σ K я это O ( п ) (каждая биссекторные причины без выборки не более одного испорченных паров точек), поэтому во время запросаΣяО(1+журналКя)КяYяΣКяО(N) также является O ( n ) .ΣяО(1+журналКя)О(N)


1
PS вот альтернативный вариант решения 2, который использует то же пространство и время запроса, но заменяет
Дэвид Эппштейн

Зачем выполнять предварительную обработку когда можно отсортировать по всем n начальным точкам за O ( n 2 log n ) времени и сохранить результаты в хеш-таблице, используя пространство O ( n 2 ) для постоянного поиска? N4NО(N2журналN)О(N2)
Дейв

Потому что есть начальных точек с разными порядками сортировки, а не Θ ( n 2 ) . Θ(N4)Θ(N2)
Дэвид Эппштейн

1

Вы, вероятно, не сможете уйти от времени, как бы вы его ни разрезали; даже предварительные вычисления областей, соответствующих всем возможным порядкам сортировки, могут (я считаю) привести к O ( n ! ) областям, и, таким образом, нахождение «вашей» области с помощью любого значимого метода поиска примет O ( log ( n ! ) ) = O ( n log ( n) ) ) время. ( РЕДАКТИРОВАТЬ:Nжурнал(N)О(N!)О(журнал(N!))знак равноО(Nжурнал(N))это абсолютно неправильно; см. отличный ответ Дэвида Эппштейна для получения дополнительной информации!) С другой стороны, один полезный способ снизить сложность - особенно, если вам не нужна полная сортировка сразу, а просто нужно иметь возможность случайным образом выбрать й ближайший на лету - может быть с помощью диаграмм Вороного высшего порядка: расширения стандартной ячейки Вороного, в которых размещается не только ближайший сосед, но и второй ближайший, и т. д. Статья Фрэнка Дине о поиске k-ближайшего соседа, http: //people.scs .carleton.ca / ~ dehne / публикации / 2-02.pdf представляется канонической ссылкой; На его домашней странице http://www.dehne.carleton.ca/publications есть ряд других статей о диаграммах Вороного, которые могут быть полезны.К


3
Если разделить плоскость на области с разными порядками сортировки, существует областей, а не O ( n ! ) . Границами между областями являются перпендикулярные биссектрисы линий пар точек, таких линий Θ ( n 2 ) , а набор областей задается расположением этих линий. Θ(N4)О(N!)Θ(N2)
Дэвид Эппштейн

@ Дэвид, я думаю, ты должен ответить на этот вопрос.
Джеймс Кинг,

Вторую - п! чувствовал себя неправильно, когда я писал это, но я не мог видеть дело против. Я исправлю свой ответ в ближайшее время, чтобы исправить это, но я действительно хотел бы видеть более прямо информированный; Спасибо!
Стивен Стадницки
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.