<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=93.175.3.165&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=93.175.3.165&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/93.175.3.165"/>
		<updated>2026-04-23T19:48:28Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BE%D1%85%D0%B2%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B0%D1%8F_%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%82%D0%BE%D1%87%D0%B5%D0%BA&amp;diff=65243</id>
		<title>Минимальная охватывающая окружность множества точек</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BE%D1%85%D0%B2%D0%B0%D1%82%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B0%D1%8F_%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D1%82%D0%BE%D1%87%D0%B5%D0%BA&amp;diff=65243"/>
				<updated>2018-05-05T07:05:19Z</updated>
		
		<summary type="html">&lt;p&gt;93.175.3.165: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ready}}&lt;br /&gt;
== Описание ==&lt;br /&gt;
Минимальная охватывающая окружность множества точек (smallest enclosing disc) - это задача, в которой необходимо по заданному набору точек найти окружность минимального радиуса, которая содержит все точки множества.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм ==&lt;br /&gt;
Сперва приведем алгоритм, корректность которого позднее будет доказана.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим метод &amp;lt;tex&amp;gt; MinDisc &amp;lt;/tex&amp;gt;, который будет принимать на вход множество точек, а возвращать будет искомую охватывающую окружность. Идея метода в том, что он генерирует случайную перестановку из точек, которые поступили на вход и в получившимся порядке по одной добавляет их в текущую охватывающую окружность. Как будет доказано позднее, если на каком-то шаге алгоритма текущая точка оказалась вне текущей минимальной окружности, то утверждается, что она лежит на границе новой окружности, которая будет содержать в себе ее и все предыдущие точки. Опишем приведенный выше алгоритм псевдокодом:&lt;br /&gt;
&lt;br /&gt;
 MinDisc(S)&lt;br /&gt;
    Let P - random permutation of S&lt;br /&gt;
    Let D2 - be the smallest enclosing disc for {p1, p2}.&lt;br /&gt;
    for i = 3 to n {&lt;br /&gt;
        if pi &amp;lt;tex&amp;gt; \in &amp;lt;/tex&amp;gt; Di−1  then Di = Di−1 // point is inside. nothing to do here&lt;br /&gt;
                      else Di = MinDiscWithPoint ({p1,...,pi−1}, pi) // point is lying on the boundary of minimal circle&lt;br /&gt;
    }&lt;br /&gt;
    return Dn&lt;br /&gt;
&lt;br /&gt;
Как вы заметили, мы использовали выше метод &amp;lt;tex&amp;gt; MinDiscWithPoint &amp;lt;/tex&amp;gt; - это метод, который по множеству точек и еще одной точке возвращают искомую окружность. При этом выделенная точка (которая передается в качестве второго аргумента) ''обязательно'' лежит ''на'' окружности. Эта функция очень похожа на предыдущую, поэтому приведу лишь ее псевдокод:&lt;br /&gt;
&lt;br /&gt;
 MinDiscWithPoint(S, q)&lt;br /&gt;
    Let P - random permutation of S&lt;br /&gt;
    Let D1 - be the smallest enclosing disc for {p1, q}.&lt;br /&gt;
    for i = 2 to n {&lt;br /&gt;
        if pi &amp;lt;tex&amp;gt; \in &amp;lt;/tex&amp;gt; Di−1  then Di = Di−1 &lt;br /&gt;
                      else Di = MinDiscWith2Points ({p1,...,pi−1}, pi, q) &lt;br /&gt;
    }&lt;br /&gt;
    return Dn&lt;br /&gt;
&lt;br /&gt;
Как и в предыдущем случае мы использовали новый метод. &amp;lt;tex&amp;gt; MinDiscWith2Points &amp;lt;/tex&amp;gt; аналогичен &amp;lt;tex&amp;gt; MinDiscWithPoint &amp;lt;/tex&amp;gt;, но в нем уже передается две точки, которые будут лежать на построенной окружности. В этой функции шафлить инпут не требуется. Опишем его псевдоком:&lt;br /&gt;
&lt;br /&gt;
 MinDiscWith2Points(P, q1, q2)&lt;br /&gt;
    Let D0 - be the smallest enclosing disc for {q1, q2}.&lt;br /&gt;
    for i = 1 to n {&lt;br /&gt;
        if pi &amp;lt;tex&amp;gt; \in &amp;lt;/tex&amp;gt; Di−1  then Di = Di−1 &lt;br /&gt;
                      else Di = сircumcircle (прим. описанная окружность) of a triangle {pi, q1, q2} &lt;br /&gt;
    }&lt;br /&gt;
    return Dn&lt;br /&gt;
&lt;br /&gt;
Как мы видим больше подобных шагов делать не нужно, так как если известно, что три точки лежат на некоторой окружности, то они однозначно ее задают.&lt;br /&gt;
&lt;br /&gt;
==Корректность алгоритма==&lt;br /&gt;
Попробуем разобраться почему этот алгоритм действительно находит искомую окружность. &lt;br /&gt;
&lt;br /&gt;
Докажем несколько вспомогательных лемм. Для удобства введем общие обозначения. Пусть &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt; - два '''непересекающихся''' множества точек на плоскоти, Пусть &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; - некоторая точка из множества &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id= ==lemma==&lt;br /&gt;
|about=лемма 1&lt;br /&gt;
|statement=&lt;br /&gt;
Окружность минимального радиуса, содержащая все точки &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; внутри себя и все точки &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt; на границе, ''уникальна''.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:MiniDisc.png|right|310px]]&lt;br /&gt;
Пусть это не так и существует две такие окружности &amp;lt;tex&amp;gt; D_0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; D_1 &amp;lt;/tex&amp;gt;. Очевидно, что в таком случае все точки из &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; должны лежать внутри &amp;lt;tex&amp;gt; D_0 \cap D_1 &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; z &amp;lt;/tex&amp;gt; - точка пересечения окружностей (смотри рисунок). Рассмотрим некоторое семейство окружностей &amp;lt;tex&amp;gt; D(\lambda), 0&amp;lt;=\lambda &amp;lt;= 1 &amp;lt;/tex&amp;gt;. При этом центры этих окружностей лежат на отрезке, соединяющем центры &amp;lt;tex&amp;gt; D_0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; D_1 &amp;lt;/tex&amp;gt;, и перемещаются очевидным образом в зависимости от параметра &amp;lt;tex&amp;gt;\lambda &amp;lt;/tex&amp;gt;. При этом радиус каждой из этих окружностей - расстояние от центра до точки &amp;lt;tex&amp;gt; z &amp;lt;/tex&amp;gt;, описанной выше. Рассмотрим окружность &amp;lt;tex&amp;gt; D(1/2) &amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt; D_0 \cap D_1 &amp;lt;/tex&amp;gt; лежит целиком внутри нее (по построению окружности &amp;lt;tex&amp;gt; D(1/2) &amp;lt;/tex&amp;gt;), а так как &amp;lt;tex&amp;gt; D(1/2) &amp;lt;/tex&amp;gt; проходит через пересечение окружностей &amp;lt;tex&amp;gt; D_0 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; D_1 &amp;lt;/tex&amp;gt;, то она проходит через все точки &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt; (так все точки &amp;lt;tex&amp;gt; R &amp;lt;/tex&amp;gt; лежат на &amp;lt;tex&amp;gt; \partial D_0 \cap \partial D_1 &amp;lt;/tex&amp;gt;.). Из этого следует, что эта окружность явлется допустимой для нашей теоремы и при этом обладает '''меньшим''' радиусом, то наше предположение неверно и искомая окружность единственная.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Далее будем называть искомую окружность &amp;lt;tex&amp;gt; md(P, R) &amp;lt;/tex&amp;gt;.''&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id= ==lemma==&lt;br /&gt;
|about=лемма 2&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt; p \in md(P \setminus \{p\}, R) &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; md(P, R) = md(P \setminus \{p\}, R) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Для множества &amp;lt;tex&amp;gt; P \setminus \{p\} &amp;lt;/tex&amp;gt; справедливо, что для него минимальный диск по определению - это &amp;lt;tex&amp;gt; md(P \setminus \{p\}, R) &amp;lt;/tex&amp;gt;, но так как &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; лежит внутри него, то он и является корректным диском для множества &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt;. Но если бы в &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; существовал еще меньший диск, то он бы существовал бы и для &amp;lt;tex&amp;gt; P \setminus \{p\} &amp;lt;/tex&amp;gt;. Значит эти диски равны(в силу единственности) и &amp;lt;tex&amp;gt; md(P, R) = md(P \setminus \{p\}, R) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id= ==lemma==&lt;br /&gt;
|about=лемма 3&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt; p \notin md(P \setminus \{p\}, R) &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; md(P, R) = md(P \setminus \{p\}, R \cup {p}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; D_0 = md(P \setminus \{p\}, R) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; D_1 = md(P, R)  &amp;lt;/tex&amp;gt;. Рассмотрим аналогичное семейство множеств &amp;lt;tex&amp;gt; D(\lambda) &amp;lt;/tex&amp;gt; как в лемме 1. Зададим это семейство с помощью окружностей  &amp;lt;tex&amp;gt; D_0 &amp;lt;/tex&amp;gt;  и &amp;lt;tex&amp;gt; D_1 &amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt; p \notin D_0 &amp;lt;/tex&amp;gt;, но &amp;lt;tex&amp;gt; p \in D_1 &amp;lt;/tex&amp;gt;. Значит найдется такое &amp;lt;tex&amp;gt; \lambda &amp;lt;/tex&amp;gt;, что точка &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; лежит на границе окружности &amp;lt;tex&amp;gt; D(\lambda) &amp;lt;/tex&amp;gt;. Но в таком случае так как эта окружность удовлетворяет условиям теоремы и к тому же обладает не большим радиусом, чем &amp;lt;tex&amp;gt; D_1 &amp;lt;/tex&amp;gt; (которая в свою очередь является минимальной охватыающей окружностью), то &amp;lt;tex&amp;gt; \lambda = 1 &amp;lt;/tex&amp;gt;. Это означает, что &amp;lt;tex&amp;gt; D(\lambda) = D_1 &amp;lt;/tex&amp;gt;, то точка &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; лежит на границе &amp;lt;tex&amp;gt; D_1 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; md(P, R) = md(P \setminus \{p\}, R \cup {p}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Эти три доказанные леммы полностью подтверждают корректность наших действий в приведенном выше алгоритме, ведь во всех трех методах в условном операторе мы используем леммы 2 и 3, корректность которых доказана. Другими словами, алгоритм действительно найдет искомую минимальную охватывающую окружность множества точек.&lt;br /&gt;
&lt;br /&gt;
==Память и время работы ==&lt;br /&gt;
Сначала разберемся с памятью. Тут все просто - никаких лишних затрат, кроме как на хранение точек нам требуется, то алгоритм требует &amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
С временем работы дела обстоят интереснее. На самом деле приведенный алгоритм работает за линейное время. Докажем этот факт.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим некоторое множество &amp;lt;tex&amp;gt; P = \{p_1, ... p_i \} &amp;lt;/tex&amp;gt; и точку &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt;, которая лежит на границе построенной охватывающей окружности.  Тогда попробуем удалить одну точку из набора &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt;. Искомая окружность может измениться только в том случае, когда эта удаленная точка лежала на границе, а вероятность этого &amp;lt;tex&amp;gt; 2 / i &amp;lt;/tex&amp;gt; (так как точек, которые образуют нашу окружность не более трех. при этом одна из этих трех точек - &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt;).  &lt;br /&gt;
&lt;br /&gt;
То оценим время работы MinDiscWithPoint c помощью доказанного выше факта.  На каждой итерации цикла будет происходить проверка, которая пройдет в &amp;quot;else&amp;quot; с вероятностью &amp;lt;tex&amp;gt; 2 / i &amp;lt;/tex&amp;gt;. А сложность работы каждого &amp;quot;else&amp;quot; - &amp;lt;tex&amp;gt; O(i) &amp;lt;/tex&amp;gt;. То суммарное время работы MinDiscWithPoint вычисляется следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; O(n) + \sum_{i=1}^{n} O(i) * (2 / i ) = O(n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Абсолютно аналогичным образом доказываем, что время работы &amp;lt;tex&amp;gt; MinDisc &amp;lt;/tex&amp;gt; есть &amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt;. То есть рассматриваемый алгоритм имеет линейную сложность.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
''Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars-Computational Geometry Algorithms and Applications, p. 86&lt;br /&gt;
''&lt;/div&gt;</summary>
		<author><name>93.175.3.165</name></author>	</entry>

	</feed>