Изменения

Перейти к: навигация, поиск
опечатка
{{ready}}== Описание ==Минимальная охватывающая окружность множества точек (smallest enclosing disc) - это задача, в которой необходимо по заданному набору точек найти окружность минимального радиуса, которая содержит все точки множества. ==Алгоритм ==Сперва приведем алгоритм, корректность которого позднее будет доказана. Рассмотрим метод <tex> MinDisc </tex>, который будет принимать на вход множество точек, а возвращать будет искомую охватывающую окружность. Идея метода в том, что он генерирует случайную перестановку из точек, которые поступили на вход и в получившимся порядке по одной добавляет их в текущую охватывающую окружность. Как будет доказано позднее, если на каком-то шаге алгоритма текущая точка оказалась вне текущей минимальной окружности, то утверждается, что она лежит на границе новой окружности, которая будет содержать в себе ее и все предыдущие точки. Опишем приведенный выше алгоритм псевдокодом:  MinDisc(S) Let P - random permutation of S Let D2 - be the smallest enclosing disc for {p1, p2}. for i = 3 to n { if pi <tex> \in </tex> Di−1 then Di = Di−1 // point is inside. nothing to do here else Di =MinDiscWithPoint ({p1,...,pi−1}, pi) // point is lying on the boundary of minimal circle } return Dn Как вы заметили, мы использовали выше метод <tex> MinDiscWithPoint </tex> - это метод, который по множеству точек и еще одной точке возвращают искомую окружность. При этом выделенная точка (которая передается в качестве второго аргумента) ''обязательно'' лежит ''на'' окружности. Эта функция очень похожа на предыдущую, поэтому приведу лишь ее псевдокод:  MinDiscWithPoint(S, q) Let P - random permutation of S Let D1 - be the smallest enclosing disc for {p1, q}. for i =Ссылки2 to n { if pi <tex> \in </tex> Di−1 then Di =Di−1 else Di = MinDiscWith2Points ({p1,...,pi−1}, pi, q) } return Dn Как и в предыдущем случае мы использовали новый метод. <tex> MinDiscWith2Points </tex> аналогичен <tex> MinDiscWithPoint </tex>, но в нем уже передается две точки, которые будут лежать на построенной окружности. В этой функции шафлить инпут не требуется. Опишем его псевдоком:  MinDiscWith2Points(P, q1, q2) Let D0 - be the smallest enclosing disc for {q1, q2}. for i = 1 to n { if pi <tex> \in </tex> Di−1 then Di = Di−1 else Di = сircumcircle (прим. описанная окружность) of a triangle {pi, q1, q2} } return Dn Как мы видим больше подобных шагов делать не нужно, так как если известно, что три точки лежат на некоторой окружности, то они однозначно ее задают. ==Корректность алгоритма==Попробуем разобраться почему этот алгоритм действительно находит искомую окружность.  Докажем несколько вспомогательных лемм. Для удобства введем общие обозначения. Пусть <tex> P </tex> и <tex> R </tex> - два '''непересекающихся''' множества точек на плоскости, Пусть <tex> p </tex> - некоторая точка из множества <tex> P </tex>.  {{Лемма|id= ==lemma==|about=лемма 1|statement=Окружность минимального радиуса, содержащая все точки <tex> P </tex> внутри себя и все точки <tex> R </tex> на границе, ''уникальна''.|proof=[http[Файл:MiniDisc.png|right|310px]]Пусть это не так и существует две такие окружности <tex> D_0 </tex> и <tex> D_1 </wwwtex>.personalОчевидно, что в таком случае все точки из <tex> P </tex> должны лежать внутри <tex> D_0 \cap D_1 </tex>.kentПусть <tex> z </tex> - точка пересечения окружностей (смотри рисунок).eduРассмотрим некоторое семейство окружностей <tex> D(\lambda), 0<=\lambda <= 1 </~rmuhammatex>. При этом центры этих окружностей лежат на отрезке, соединяющем центры <tex> D_0 </Compgeometrytex> и <tex> D_1 </MyCGtex>, и перемещаются очевидным образом в зависимости от параметра <tex>\lambda </CGtex>. При этом радиус каждой из этих окружностей -Appletsрасстояние от центра до точки <tex> z </Centertex>, описанной выше. Рассмотрим окружность <tex> D(1/centercli2) </tex>.htm]Заметим, что <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> md(P, R) </tex>.''}} {{Лемма|id= ==lemma==|about=лемма 2|statement=Если <tex> p \in md(P \setminus \{p\}, R) </tex>, то <tex> md(P, R) = md(P \setminus \{p\}, R) </tex>|proof=Для множества <tex> P \setminus \{p\} </tex> справедливо, что для него минимальный диск по определению - это <tex> md(P \setminus \{p\}, R) </tex>, но так как <tex> p </tex> лежит внутри него, то он и является корректным диском для множества <tex> P </tex>. Но если бы в <tex> P </tex> существовал еще меньший диск, то он бы существовал бы и для <tex> P \setminus \{p\} </tex>. Значит эти диски равны(в силу единственности) и <tex> md(P, R) = md(P \setminus \{p\}, R) </tex>}} {{Лемма|id= ==lemma==|about=лемма 3|statement=Если <tex> p \notin md(P \setminus \{p\}, R) </tex>, то <tex> md(P, R) = md(P \setminus \{p\}, R \cup {p}) </tex>|proof=Пусть <tex> D_0 = md(P \setminus \{p\}, R) </tex> и <tex> D_1 = md(P, R) </tex>. Рассмотрим аналогичное семейство множеств <tex> D(\lambda) </tex> как в лемме 1. Зададим это семейство с помощью окружностей <tex> D_0 </tex> и <tex> D_1 </tex>. Заметим, что <tex> p \notin D_0 </tex>, но <tex> p \in D_1 </tex>. Значит найдется такое <tex> \lambda </tex>, что точка <tex> p </tex> лежит на границе окружности <tex> D(\lambda) </tex>. Но в таком случае так как эта окружность удовлетворяет условиям теоремы и к тому же обладает не большим радиусом, чем <tex> D_1 </tex> (которая в свою очередь является минимальной охватыающей окружностью), то <tex> \lambda = 1 </tex>. Это означает, что <tex> D(\lambda) = D_1 </tex>, то точка <tex> p </tex> лежит на границе <tex> D_1 </tex>, то <tex> md(P, R) = md(P \setminus \{p\}, R \cup {p}) </tex>.}} Эти три доказанные леммы полностью подтверждают корректность наших действий в приведенном выше алгоритме, ведь во всех трех методах в условном операторе мы используем леммы 2 и 3, корректность которых доказана. Другими словами, алгоритм действительно найдет искомую минимальную охватывающую окружность множества точек. ==Память и время работы ==Сначала разберемся с памятью. Тут все просто - никаких лишних затрат, кроме как на хранение точек нам требуется, то алгоритм требует <tex> O(n) </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>. Абсолютно аналогичным образом доказываем, что время работы <tex> MinDisc </tex> есть <tex> O(n) </tex>. То есть рассматриваемый алгоритм имеет линейную сложность. ==Источники==''Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars-Computational Geometry Algorithms and Applications, p. 86''
Анонимный участник

Навигация