2012-06-08 2 views
1

Я пытаюсь придумать алгоритм, который будет делать следующее:Пустой запрос круг алгоритм

Если множество точек дается, найти для точки запроса самый большой круг (с точки запроса в его центр), который не содержит точек из множества.

До сих пор я думал об использовании диаграммы Voronoi для поиска областей (ячеек), которые содержат точки, наиболее близкие к точке сайта набора, а затем использовать список краев из Voronoi для построения трапецеидального разложения. Из декомпозиции я смогу найти, в какой ячейке находится точка запроса, а затем радиус круга будет расстоянием от точки запроса до точки (сайта) этой ячейки. Я думаю, что хранилище, необходимое для создания чего-то подобного, является линейным, так как Voronoi нуждается в O (n) -хранилище, а создание трапецеидальной декомпозиции из Voronoi также может быть выполнено с O (n) хранилищем.

* Редактировать: время запроса должно быть O (logn), что означает, что я не могу перебирать все точки набора по одному.

Правильно ли это, или я чего-то не хватает?

Кроме того, если у кого-то есть ссылки, которые я мог бы рассмотреть относительно этого алгоритма, пожалуйста, дайте мне знать. Спасибо :)

+1

«самый большой круг (с точкой запроса как его центр), который не содержит точек из набора». это всего лишь круг с наименьшим расстоянием до любой точки (эпсилон). –

+1

Я могу быть невероятно плотным здесь, но вы вычисляете расстояние от точки запроса до всех остальных и находите ближайший; ближайший расскажет вам о радиусе круга. O (n), O (1) хранения. Да? –

ответ

3

Этот вопрос, кажется, просит расстояние от точки запроса до ближайшей точки к нему в наборе, поэтому одним из способов ответа на него было бы найти ту ближайшую точку. Один из разумно стандартных способов сделать это будет с http://en.wikipedia.org/wiki/K-d_tree, и этот вопрос в общем случае рассмотрен в http://en.wikipedia.org/wiki/Nearest_neighbour_search

0

Это звучит слишком сложно. Я даже не знаю, что такое диаграмма Ворони, но при условии, что ваши точки все находятся в 2D-плоскости (что, кажется, имеет место, поскольку вы упоминаете круг, а не сферу) это довольно тривиально:

Итерации через все точки и найти точку, которая ближе всего к точке запроса. Это расстояние - это только теорема Пифагора sqrt((point_x - query_x)^2 + (point_y - query_y)^2). Наименьшее расстояние - это радиус круга.

+2

+1 Вы даже можете опустить квадратную корневую часть N-1 расчётов расстояний и просто сделать самый маленький! –

+0

Я пытаюсь сократить время запроса, не повторяя все точки в наборе. Используя мой предложенный алгоритм, я получаю O (logn) время запроса, а не O (n), итерируя каждую точку множества. – touvlo2000

+0

@ ErnestFriedman-Hill Очень хорошая точка :) – Paulpro

Смежные вопросы