
- •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.2. Алгоритм Джарвиса
Анализируя свойства выпуклой оболочки
можно заметить, что если провести прямую
по ребру принадлежащему оболочке, все
вершины множества
окажутся по одну сторону от этой прямой
или на самой прямой (свойство
).
Используя это свойство можно выделить
ребер, удовлетворяющих заданному
критерию, а затем расставить их в порядке
следования. Очевидно, в худшем случае
.
Джарвис предложил алгоритм, несколько
оптимизирующий указанный выше способ.
Алгоритм Джарвиса обходит выпуклую
оболочку, порождая в нужном порядке
последовательность крайних точек, по
одной на каждом шаге. Этот процесс очень
напоминает заворачивание предмета в
бумагу, поэтому он имеет также другое
название - «заворачивание подарка».
Выбор вершин выпуклой оболочки ведется
по некоторому критерию, сохраняющему
свойство
.
Рассмотрим следующую последовательность
операций:
Найдем точку (обозначим ее
), которая заведомо будет принадлежать выпуклой оболочке (например, самую правую точку с минимальной координатой поy) и запомним ее.
Пусть построена последовательность вершин
выпуклой оболочки. В качестве точки
выберем нерассмотренную к этому моменту вершину, имеющую наименьший полярный угол относительно
Повторим шаг 2 для второй и последующих точек выпуклой оболочки до тех пор, пока в оболочку не будет включена вершина с максимальным значением у-координаты.
Далее начинается обратный проход, который повторяет шаг 2 с единственной ремаркой: при сравнении полярных углов необходимо искать минимальный относительно отрицательного направления оси абсцисс.
Пример отбора точек при обходе Джарвиса показан на рисунке:
Оценим время работы этого метода. Для
каждой вершины выпуклой оболочки
находятся полярные углы всех остальных
точек (это требует
времени), и среди этих полярных углов
ищется минимальный (еще
).
Нетрудно видеть, что данный процесс
напоминает сортировку простым выбором
минимального элемента! Если оболочка
состоит из
точек, то время работы равно
26.
Наихудшим будет случай, когда все точки
исходного множества принадлежат выпуклой
оболочке. В этом случае время работы
метода составит
.
Как следует из анализа сложности
алгоритма, для худшего случая алгоритм
Джарвиса затрачивает больше времени,
чем алгоритм Грэхема. Однако, если число
вершин выпуклой оболочки невелико (или
является медленно растущей функцией
(медленнее, чем
)),
то алгоритм Джарвиса в этом случае
является более предпочтительным.
5.2.3. Метод разделяй и властвуй.
Поскольку задача построения выпуклой
оболочки легко разбивается на подзадачи,
можно для ее решения применить технику
«разделяй и властвуй». Разобьем множество
из
точек на два подмножества
и
по
и
точек в каждом соответственно. После
разбиения можно рекурсивно строить
выпуклую оболочку для каждого из множеств
и
.
Для построения
необходимо решить задачу слияния
оболочек
и
.
С этой целью выберем некоторую внутреннюю
точку
множества
.
Например, в качестве
можно взять центроид трех любых вершин,
лежащих на
.
Далее рассмотрим следующие варианты:
точка
является внутренней вершиной в
. Условие выполняется, если при обходе вершин из
против часовой стрелки, вершина
все время лежит слева от ребер соответствующего многоугольника. Данная процедура занимает
времени. Поскольку вершины
и
являются упорядоченными по полярному углу относительно точки
, можно, используя метод Грэхема, построить за
времени выпуклую оболочку для множества
. Эта ситуация проиллюстрирована на рисунке ниже
точка
не является внутренней вершиной в
.Поместим в точку
точечный источник света, который «освещает» точки из
. Из
выходят два луча (опорные прямые), касающиеся
в точках
и
. Тогда цепь, составляющая
, разбивается точками
и
на освещенную и затененную части. При движении против часовой стрелке вокруг точки
от точки
к
по затененной части полярный угол возрастает, а такое же движение от
к
по освещенной части вызывает уменьшение значения угловой меры. Можно не рассматривать вершины освещенной части цепи, поскольку они являются внутренними точками множества
. Затененная часть границы
и граница множества
представляют собой два упорядоченных списка, которые содержат в общей сумме не более
вершин. После слияния этих последовательностей (требует не более
времени), применяем к получившейся последовательности метод Грэхема и строим
Обозначая время работы алгоритма на
точках через
и учитывая, что построение опорных
прямых требует
времени, имеем следующие рекуррентные
соотношения
где
- некоторые константы. Решением этого
уравнения является функция
Метод разделяй и властвуй имеет много общего с алгоритмом сортировки слиянием. Идеи, заложенные в алгоритме Quicksort, нашли отражение в методе построения выпуклой оболочки, названном