- это множество точек на плоскости. Случайная точка x ∉ S задается на той же плоскости. Задача состоит в том, чтобы отсортировать все y ∈ S по евклидову расстоянию между x и y .
Бездумный подход состоит в том, чтобы вычислить расстояния между и y для всех y ∈ S, а затем отсортировать их, используя любой быстрый алгоритм.
Есть ли способ сохранить или предварительно обработать чтобы процесс сортировки стал быстрее?
cg.comp-geom
sorting
Алекс К.
источник
источник
Ответы:
Решение 1. Найдите перпендикулярные биссектрисы между парами точек и постройте расположение этих прямых. Компоновка имеет Θ ( n 4 ) ячеек, в которых отсортированный порядок постоянен. Поэтому создайте структуру данных местоположения точек для расположения и украсьте каждую ячейку отсортированным порядком, который должен быть возвращен для точек в этой ячейке. Сортированные порядки между соседними ячейками различаются только в одном транспонировании, поэтому вы можете использовать постоянную структуру данных, чтобы представления этих отсортированных порядков могли совместно использовать пространство. Общее пространство O ( n 4 ) и время запроса OΘ(n2) Θ ( н4) O ( n4) .O ( журналн )
Решение 2: Выберите случайную выборку из этих же перпендикулярных биссектрис, построите их расположение и разделите каждую ячейку расположения вертикальными отрезками, проходящими через каждое пересечение двух выбранных линий. Результирующее разбиение имеет Θ ( n 2 ) ячеек, каждая из которых с высокой вероятностью пересекается O ( n ) несэмплированными биссектрисами. Украсьте каждую ячейку раздела с помощью правильного отсортированного порядка точек, если смотреть с некоторого x внутри ячейки. Общее пространство O ( n 3 ) .Θ ( н ) Θ ( н2) O ( n ) O ( n3)
Теперь, чтобы выполнить запрос, найдите точку запроса в разделе, найдите порядок, сохраненный в ячейке раздела, и используйте алгоритм сортировки сравнения декартовых деревьев Levcopoulos & Petersson (1989), начиная с этого сохраненного порядка. Время для этого шага пропорционально где k i - количество точек, которые не соответствуют порядку точки y i . Но Σ K я это O ( п ) (каждая биссекторные причины без выборки не более одного испорченных паров точек), поэтому во время запросаΣяO ( 1 + журналКя) Кя Yя ∑ кя O ( n ) также является O ( n ) .ΣяO ( 1 + журналКя) O ( n )
источник
Вы, вероятно, не сможете уйти от времени, как бы вы его ни разрезали; даже предварительные вычисления областей, соответствующих всем возможным порядкам сортировки, могут (я считаю) привести к O ( n ! ) областям, и, таким образом, нахождение «вашей» области с помощью любого значимого метода поиска примет O ( log ( n ! ) ) = O ( n log ( n) ) ) время. ( РЕДАКТИРОВАТЬ:n log( н ) O ( n ! ) O ( журнал( n ! ) ) = O ( n log( н ) ) это абсолютно неправильно; см. отличный ответ Дэвида Эппштейна для получения дополнительной информации!) С другой стороны, один полезный способ снизить сложность - особенно, если вам не нужна полная сортировка сразу, а просто нужно иметь возможность случайным образом выбрать й ближайший на лету - может быть с помощью диаграмм Вороного высшего порядка: расширения стандартной ячейки Вороного, в которых размещается не только ближайший сосед, но и второй ближайший, и т. д. Статья Фрэнка Дине о поиске k-ближайшего соседа, http: //people.scs .carleton.ca / ~ dehne / публикации / 2-02.pdf представляется канонической ссылкой; На его домашней странице http://www.dehne.carleton.ca/publications есть ряд других статей о диаграммах Вороного, которые могут быть полезны.К
источник