Изменения

Перейти к: навигация, поиск
опечатка
{{notreadyready}}
== Описание ==
Минимальная охватывающая окружность множества точек (smallest enclosing disc) - это задача, в которой необходимо по заданному набору точек найти окружность минимального радиуса, которая содержит все точки множества.
Сперва приведем алгоритм, корректность которого позднее будет доказана.
Рассмотрим метод <tex> MinDisc </tex>, который будет принимать на вход множество точек, а возвращать будет искомую охватывающую окружность. Идея метода в том, что он генерирует случайную перестановку из точек, которые поступили на вход и в получившимся порядке по одной добавляет их в текущую охватывающую окружность. Как будет доказано позднее, если на каком-то шаге алгоритма текущая точка оказалась вне текущей минимальной окружности, то утверждается, что она лежит на границе новой окружности, которая будет содержать в себе ее и все предыдущие точки. Опишем приведенный выше алгоритм псевдокомпсевдокодом:
MinDisc(S)
return Dn
Как и в предыдущем случае мы использовали новый метод. <tex> MinDiscWith2Points </tex> аналогичен <tex> MinDiscWithPoint </tex>, но в нем уже передается две точки, которые будут лежать на построенном построенной окружности. В этой функции шафлить инпут не требуется. Опишем его псевдоком:
MinDiscWith2Points(P, q1, q2)
Попробуем разобраться почему этот алгоритм действительно находит искомую окружность.
Докажем несколько вспомогательных лемм. Для удобства введем общие обозначения. Пусть <tex> P </tex> и <tex> R </tex> - два '''непересекающихся''' множества точек на плоскотиплоскости, Пусть <tex> p </tex> - некоторая точка из множества <tex> P </tex>.
{{Лемма
|about=лемма 1
|statement=
Окружность минимального радиуса, содержащая все точки <tex> P </tex> внутри себя и все точки <tex> R </tex> на границе , ''уникальна''.
|proof=
[[Файл:MiniDisc.png|right|310px]]
Пусть это не так и существует две такие окружности <tex> D_0 </tex> и <tex> D_1 </tex>. Очевидно, что в таком случае все точки из <tex> P </tex> должны лежать внутри <tex> D_0 \cap D_1 </tex>. Пусть <tex> z </tex> - точка пересечения окружностей (смотри рисунок). Рассмотрим некоторое семейство окружностей <tex> D(\lambda), 0<=\lambda <= 1 </tex>. При этом центры этих окружностей лежат на отрезке, соединяющем центры <tex> D_0 </tex> и <tex> D_1 </tex>, и перемещаются очвеидным очевидным образом в зависимости от параметра <tex>\lambda </tex>. При этом радиус каждой из этих окружностей - расстояние от центра до точки <tex> z </tex>, описанной выше. Рассмотрим окружность <tex> D(1/2) </tex>. Заметим, что <tex> D_0 \cap D_1 </tex> лежит целиком внутри нее (по построению окружности <tex> D(1/2) </tex>), а так как <tex> D(1/2) </tex> проходит через пересечение окружностей <tex> D_0 </tex> и <tex> D_1 </tex>, то она проходит через все точки <tex> R </tex> (так все точки <tex> R </tex> лежат на <tex> \partial D_0 \cap \partial D_1 </tex>.). Из этого следует, что эта окружность явлется допустимой для нашей теоремы и при этом обладает '''меньшим''' радиусом, то наше предположение неверно и искомая окружность единственная.
Рассмотрим некоторое множество <tex> P = \{p_1, ... p_i \} </tex> и точку <tex> q </tex>, которая лежит на границе построенной охватывающей окружности. Тогда попробуем удалить одну точку из набора <tex> P </tex>. Искомая окружность может измениться только в том случае, когда эта удаленная точка лежала на границе, а вероятность этого <tex> 2 / i </tex> (так как точек, которые образуют нашу окружность не более трех. при этом одна из этих трех точек - <tex> q </tex>).
То оценим время работы MinDiscWithPoint c помощью доказанного выше факта. На каждой итераций итерации цикла будет происходить проверка, которая пройдет в "else" с вероятностью <tex> 2 / i </tex>. А сложность работы каждого "else" - <tex> O(i) </tex>. То суммарное время работы MinDiscWithPoint вычисляется следующим образом:
<tex> O(n) + \sum_{i=1}^{n} O(i) * (2 / i ) = O(n) </tex>.
Анонимный участник

Навигация