Это не официальный сайт wikipedia.org 01.01.2023

Алгоритм Киркпатрика — Википедия

Алгоритм Киркпатрика

Построение выпуклой оболочки методом «разделяй и властвуй» — алгоритм построения выпуклой оболочки.

ОписаниеПравить

Дано множество S  , состоящее из N   точек.

  1. Если N N 0   ( N 0   — некоторое небольшое целое число), то построить выпуклую оболочку одним из известных методов и остановиться, иначе перейти к шагу 2.
  2. Разобьём исходное множество S   произвольным образом на два примерно равных по мощности подмножества S 1   и S 2   (пусть S 1   содержит N / 2   точек, а S 2   содержит N N / 2   точек).
  3. Рекурсивно находим выпуклые оболочки каждого из подмножеств S 1   и S 2  .
  4. Строим выпуклую оболочку исходного множества как выпуклую оболочку объединения двух выпуклых многоугольников C H ( S 1 )   и C H ( S 2 )  .

Поскольку: C H ( S ) = C H ( S 1 S 2 ) = C H ( C H ( S 1 ) C H ( S 2 ) )  , сложность этого алгоритма является решением рекурсивного соотношения T ( N ) 2 T ( N / 2 ) + f ( N )   , где f ( N )   — время построения выпуклой оболочки объединения двух выпуклых многоугольников, каждый из которых имеет около N / 2   вершин. Далее будет показано, что T ( N ) = O ( N log N )  .

ОпределенияПравить

Опорной прямой к выпуклому многоугольнику P   называется прямая l  , проходящая через некоторую вершину многоугольника P   таким образом, что все внутренние точки многоугольника лежат по одну сторону от прямой l  .

К выпуклому многоугольнику P   можно построить опорные прямые из точки A  , не принадлежащей ему. Воспользуемся тем, что прямая A P i  , где P i   — некоторая вершина многоугольника P  , является опорной к P   в том и только в том случае, если ребра ( P i 1 , P i )   и ( P i , P i + 1 )   лежат в одной полуплоскости, ограниченной этой прямой. Нетрудно видеть, что для построения опорных прямых требуется в худшем случае один обход вершин многоугольника P  , то есть они ищутся за линейное время.

РеализацияПравить

Пусть мы уже имеем построенные выпуклые оболочки P 1   и P 2  .

  1. Найдём некоторую внутреннюю точку A   многоугольника P 1   (например, центроид любых трёх вершин P 1  ). Такая точка A   будет внутренней точкой C H ( P 1 P 2 )  .
  2. Возможно два случая:
    1. Точка A   не является внутренней точкой многоугольника P 2  . Проводим две опорные прямые для многоугольника P 2  , проходящие через точку A  . Эти опорные прямые проходят через вершины B   и C   многоугольника P 2  . Все точки внутри треугольника A B C   не принадлежат границе выпуклой оболочки C H ( P 1 P 2 )  . Все остальные точки упорядочиваем по полярному углу относительно точки A  , слиянием двух упорядоченных списков вершин за время O ( N 1 ) + O ( N 2 ) = O ( N )  , а затем применяем к полученному списку метод обхода Грэхема, требующий лишь линейное время.
    2. Точка A   является внутренней точкой многоугольника P 2  . Упорядочиваем вершины обоих многоугольников относительно центра A  , сливая два упорядоченных списка вершин P 1   и P 2   за O ( N )  .
  3. Теперь к полученному списку вершин можно применить алгоритм Грэхема за исключением фазы сортировки точек по полярной координате, тогда он будет выполнен за линейное время.

Теперь получена выпуклая оболочка объединения выпуклых многоугольников P 1 P 2  .

Сложность алгоритмаПравить

В сумме все три фазы алгоритма выполняются за время O ( N )  . Таким образом, f ( N ) = O ( N )   и получаем соотношение T ( N ) 2 T ( N / 2 ) + O ( N )  , решением которого, как известно, является T ( N ) = O ( N log N )  , что и определяет сложность алгоритма.

СсылкиПравить