Минимальная охватывающая окружность множества точек — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм)
(Алгоритм)
Строка 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) - это задача, в которой необходимо по заданному набору точек найти окружность минимального радиуса, которая содержит все точки множества.

Алгоритм

Сперва приведем алгоритм, корректность которого позднее будет доказана.

Рассмотрим метод [math] MinDisc [/math], который будет принимать на вход множество точек, а возвращать будет искомую охватывающую окружность. Идея метода в том, что он генерирует случайную перестановку из точек, которые поступили на вход и в получившимся порядке по одной добавляет их в текущую охватывающую окружность. Как будет доказано позднее, если на каком-то шаге алгоритма текущая точка оказалась вне текущей минимальной окружности, то утверждается, что она лежит на границе новой окружности, которая будет содержать в себе ее и все предыдущие точки. Опишем приведенный выше алгоритм псевдоком:

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 [math] \in [/math] 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

Как вы заметили, мы использовали выше метод [math] MinDiscWithPoint [/math] - это метод, который по множеству точек и еще одной точке возвращают искомую окружность. При этом выделенная точка (которая передается в качестве второго аргумента) обязательно лежит на окружности. Эта функция очень похожа на предыдущую, поэтому приведу лишь ее псевдокод:

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 [math] \in [/math] 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