Я не знаю, как решить эту проблему за времени, но алгоритм существует.O ( n 2 log n )O(n2)O(n2logn)
Пусть - окружность, центр которой - , точка с радиусом . Нетрудно обнаружить, что множество точек может быть окружено окружностью с радиусом если пересечение с не является пустым. Более того, если не пусто, в некоторой (границе ) должны быть некоторые точки в ). Таким образом, для каждого C (s_i) и каждой точки p на его бондарности мы пытаемся найти, сколько кругов содержитs i i r P = { p 0 , p 1 , … , p m } r I ( P ) C ( p 0 ) , C ( p 1 ) , … , C ( p m ) I ( P ) I ( P ) bd C ( p i )C(si)siirP={p0,p1,…,pm}rI(P)C(p0),C(p1),…,C(pm)I(P)I(P)bdC(pi)C ( s i ) p pC(pi)C(si)pp . Максимальное количество среди всех p будет ответом на эту проблему.
Давайте рассмотрим точки в . Существует взаимно-однозначное соответствие между точками на и действительным числом в . Для каждого круга пересечение между и может быть представлено интервалом . Таким образом, для всех кругов, кроме , существует не более интервалов (некоторые круги могут не пересекаться с ). Максимальное количество может быть легко найдено путем сортировки всех конечных точек интервала, сканирования их по порядку и подсчета текущего числа с перекрытием. Для каждогоbd C ( s i ) [ 0 , 2 π ) C ( s j ) C ( s j ) bd C ( s i ) [ b e g i n j , e n d j ] C ( s) i ) n - 1 C ( s i ) 2bdC(si)bdC(si)[0,2π)C(sj)C(sj)bdC(si)[beginj,endj]C(si)n−1C(si)2(n−1)C(si) , этот шаг может быть выполнен за времени, и существует таких кругов, поэтому временная сложность этого алгоритма составляет .O(nlogn)nO(n2logn)
Я думаю, что трудным вопросом является знание, является ли выбранный вами круг «максимальным» в наборе. Единственный способ определить это - попробовать все возможные комбинации точек и проверить размер окружности, которая их охватывает.
Вы можете уменьшить пространство поиска, сначала разделив пространство точек на сетку квадратных ячеек шириной 2r. Затем найдите ячейку с наибольшей плотностью. Поскольку вы уже нашли один круг из X точек, вы можете сделать вывод, что если круг существует с большим количеством точек, то в нем должно быть как минимум X точек. И используйте это как отправную точку для тестирования различных комбинаций точек.
Если вы ищете только набор точек, который, вероятно, будет максимальным, то вы можете еще больше уменьшить количество комбинаций, которые вам нужно проверить, выбрав те точки, которые попадают в окрестность ячеек, где плотность окрестности больше X.
Сказав это, оба «сокращения» могут потерпеть неудачу, и в худшем случае вы будете вычислять круги для всех возможных комбинаций точек.
источник
В Chazelle, B .; Lee, в статье DT Computing 36, 1-16 (1986), теорема 3 на стр. 15, говорится, что алгоритм поиска максимального окружающего круга требует временных затрат.O(n2)
Я думаю, что ключом по-прежнему является алгоритм построения графа пересечений он упоминает ранее (или см. Edelsbrunner, H. (1987), Algorithms in Combinatorial Geometry, глава 7). После этого поиск максимального круга должен быть простым.O(n2)
По-видимому, эта задача эквивалентна нахождению точки, покрытой максимальным количеством заданных окружностей, и легко узнать, что только те точки, которые пересекаются заданными n окружностями, должны рассматриваться как кандидаты. (Это также приводит к алгоритму напрямую)2n2 O(n2log(n))
Однако, используя вышеупомянутый алгоритм построения , он также приводит алгоритм для этой задачи. Потому что граф пересечений, построенный с вершинами в качестве точек пересечения и ребрами в виде дуг, является планарным графом Эйлера. Таким образом, можно просто пройти все дуги через цикл Эйлера и порядок дуг, проиндексированных по индексам окружностей, к которым он принадлежит, и информацию о том, является ли какая-либо дуга «уходящей дугой» (изогнутой назад) или «входящей в дугу» ( кривая вперед) для встреченной вершины, на которую падает эта дуга, будет записано.O(n2) O(n2)
По теореме Джордана вершина пересечения окружена окружностью только в том случае, если она сначала встречает «уходящую дугу», принадлежащую этому кругу, или имеет падающую дугу, принадлежащую этому кругу. Таким образом, после всего путешествия можно легко найти максимальный окружающий круг. Это аналогично случаю определения времен покрытия для точек с упорядоченными интервалами вдоль прямой линии (или т. Е. Одномерной версии этой охватывающей задачи), за исключением того, что порядок уже задан путём перемещения. В то время как по формуле Эйлера для плоского графа, общее количество дуг является линейным с количеством вершин, и, поскольку нет необходимости снова записывать связанную информацию при возвращении к уже посещенным вершинам путем рукопожатия лемма, общая стоимость времени будет O ( nV+E−F=2 .O(n2)
источник