
- •4. Задача поиска
- •4.1. Задача поиска на множестве
- •4.2. Задача динамического поиска
- •4.3. Порядковые статистики
- •4.4. Хеширование
- •4.5. Поиск подстрок
- •4.5.1. Алгоритм Рабина-Карпа
- •4.5.2. Алгоритм Кнута-Морриса-Пратта
- •4.5.3. Алгоритм Бойера-Мура
- •5. Сортировка, выпуклые оболочки
- •5.1. Задача сортировки
- •5.2. Задача построения выпуклой оболочки
- •5.2.1. Алгоритм Грэхема
- •5.2.2. Алгоритм Джарвиса
- •5.2.3. Метод разделяй и властвуй.
- •5.2.4. QuickHull
- •5.2.5. Алгоритм Чена
5.2. Задача построения выпуклой оболочки
В завершение мы рассмотрим задачу
построения выпуклой оболочки для
конечного множества точек в двумерном
Евклидовом пространстве. Эта задача
хорошо исследована, является составной
частью большого числа задач вычислительной
геометрии, и имеет много приложений в
области распознавания образов, при
обработке изображений, в математической
статистике, в задачах раскроя материалов
и т.п. С другой стороны задача построения
выпуклой оболочки множества тесно
связана с задачей сортировки данных.
Ранее было показано, что задача сортировки
за линейное время сводится к задаче
построения выпуклой оболочки множества,
в силу чего нижняя оценка времени для
задачи построения выпуклой оболочки
на множестве из
точек составляет
.
Построение выпуклой оболочки является
прекрасным примером задачи, когда идеи,
полученные на одном классе задач
переносятся на другой класс и дают при
этом хорошие результаты. Рассмотрим
некоторые подходы к решению задачи в
двумерной области, изложенные в [4,5,26]
Определение 1. Множество,
будет называться выпуклым, если для
любой пары точек
и
из
отрезок с концами
и
целиком принадлежит
.
Определение 2. Точкавыпуклого множества
называется крайней, если не существует
пары точек
и
,
из
таких, что
,
(т.е.
не является внутренней точкой отрезка
с концами
и
).
Определение 3. Выпуклой оболочкой
множества точекназывается граница наименьшей выпуклой
области в
,
которая охватывает
.
Обозначим выпуклую оболочку множества
через
.
Выпуклая оболочка для конечного множества
точек
является выпуклым многоугольником,
содержащим все его точки. Очевидно, что
множество крайних точек из
является наименьшим подмножеством
,
выпуклая оболочка которого, является
выпуклой оболочкой множества
:
(
).
В связи с этим напрашивается выполнение
следующих процедур в алгоритме построения
выпуклой оболочки:
1. Определение всех крайних точек.
2. Построение линейного порядка на крайних точках так, чтобы они образовали выпуклый многоугольник.
Для решения первой задачи можно использовать следующий результат.
Теорема[5]. Точка
не
является крайней точкой множества
только
тогда, когда она лежит в некотором
треугольнике, вершины которого принадлежат
S, но сама она не является вершиной этого
треугольника.
Согласно этой теореме достаточно
перебрать все тройки вершин, принадлежащих
,с последующим удалением всех точек,
лежащих внутри треугольника, задаваемого
этой тройкой вершин. Поскольку число
различных треугольников равно
,
а для каждого из рассматриваемых
треугольников за константное время
можно определить, лежит ли некоторая
точка внутри треугольника, вся процедура
перебора занимает
времени. Вторая задача решается
сортировкой и требует
времени.
При таком подходе верхняя оценка сильно
отличается от нижней. Неэффективность
предложенного алгоритма связана прежде
всего с избыточным перебором. Алгоритм
построен на исключении из множества
точек, которые не входят в выпуклую
оболочку, при этом перебор соответствующих
точек ведется случайным образом,
информация, которая связана с одной и
той же точкой вычисляется многократно
(одна и та же вершина может лежать в
большом числе треугольников). Поскольку
полученная после первого шага
последовательность крайних точек никак
не связана с порядком их перечисления
в выпуклой оболочке, необходим второй
шаг.
Все описанные ниже алгоритмы задают определенный порядок перечисления кандидатов на включение в выпуклую оболочку, но при этом используют различные свойства выпуклой оболочки.