Минимальная охватывающая окружность множества точек — различия между версиями
Gr1n (обсуждение | вклад) (→Алгоритм) |
Gr1n (обсуждение | вклад) (→Алгоритм) |
||
Строка 5: | Строка 5: | ||
==Алгоритм == | ==Алгоритм == | ||
Сперва приведем алгоритм, корректность которого позднее будет доказана. | Сперва приведем алгоритм, корректность которого позднее будет доказана. | ||
+ | |||
Рассмотрим метод <tex> MinDisc </tex>, который будет принимать на вход множество точек, а возвращать будет искомую охватывающую окружность. Идея метода в том, что он генерирует случайную перестановку из точек, которые поступили на вход и в получившимся порядке по одной добавляет их в текущую охватывающую окружность. Как будет доказано позднее, если на каком-то шаге алгоритма текущая точка оказалась вне текущей минимальной окружности, то утверждается, что она лежит на границе новой окружности, которая будет содержать в себе ее и все предыдущие точки. Опишем приведенный выше алгоритм псевдоком: | Рассмотрим метод <tex> MinDisc </tex>, который будет принимать на вход множество точек, а возвращать будет искомую охватывающую окружность. Идея метода в том, что он генерирует случайную перестановку из точек, которые поступили на вход и в получившимся порядке по одной добавляет их в текущую охватывающую окружность. Как будет доказано позднее, если на каком-то шаге алгоритма текущая точка оказалась вне текущей минимальной окружности, то утверждается, что она лежит на границе новой окружности, которая будет содержать в себе ее и все предыдущие точки. Опишем приведенный выше алгоритм псевдоком: | ||
Строка 13: | Строка 14: | ||
if pi <tex> \in </tex> Di−1 then Di = Di−1 // point is inside. nothing to do here | 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 | 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 | return Dn |
Версия 13:23, 16 января 2014
Конспект не готов. |
Описание
Минимальная охватывающая окружность множества точек (smallest enclosing disc) - это задача, в которой необходимо по заданному набору точек найти окружность минимального радиуса, которая содержит все точки множества.
Алгоритм
Сперва приведем алгоритм, корректность которого позднее будет доказана.
Рассмотрим метод
, который будет принимать на вход множество точек, а возвращать будет искомую охватывающую окружность. Идея метода в том, что он генерирует случайную перестановку из точек, которые поступили на вход и в получившимся порядке по одной добавляет их в текущую охватывающую окружность. Как будет доказано позднее, если на каком-то шаге алгоритма текущая точка оказалась вне текущей минимальной окружности, то утверждается, что она лежит на границе новой окружности, которая будет содержать в себе ее и все предыдущие точки. Опишем приведенный выше алгоритм псевдоком: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
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
Как вы заметили, мы использовали выше метод
- это метод, который по множеству точек и еще одной точке возвращают искомую окружность. При этом выделенная точка (которая передается в качестве второго аргумента) обязательно лежит на окружности. Эта функция очень похожа на предыдущую, поэтому приведу лишь ее псевдокод: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
Di−1 then Di = Di−1
else Di = MinDiscWith2Points ({p1,...,pi−1}, pi, q)
}
return Dn
Корректность алгоритма
Память и время работы
Источники
Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars-Computational Geometry Algorithms and Applications, p. 86