- •Содержание
- •Введение.
- •1. Основы анализа алгоритмов
- •1.1. Сравнительные оценки алгоритмов
- •1.2. Элементарные операции в формальной системе
- •1.3. Классы входных данных
- •1.4. Классификация алгоритмов по виду функции трудоемкости
- •1.5. Классификация скоростей роста. Асимптотический анализ функций
- •1. Оценка (тета)
- •2. Оценка о (о большое)
- •3. Оценка (Омега)
- •1.6. Эффективность рекурсивных алгоритмов
- •1.7. Анализ программ
- •1.8. Вопросы для самоконтроля
- •Классификация алгоритмов по виду функции трудоемкости.
- •2. Алгоритмы поиска и выборки
- •2.1. Последовательный поиск
- •2.2. Двоичный поиск
- •2.3. Задача выборки
- •2.4. Вопросы для самоконтроля
- •3.Алгоритмы сортировки
- •3.1. Сортировка трех чисел по месту
- •3.2. Сортировка вставками
- •3.3. Пузырьковая сортировка
- •3.4. Сортировка Шелла.
- •3.5. Корневая сортировка
- •3.6. Сортировка методом индексов
- •3.7. Быстрая сортировка (алгоритм Хоара)
- •3.8. Вопросы для самоконтроля
- •Сортировка Шелла.
- •Сортировка методом индексов.
- •4. Алгоритмы на графах
- •4.1. Основные понятия теории графов
- •4.2. Структуры данных для представления графов
- •4.3. Алгоритмы обхода вершин графа
- •4.3.1. Обход в глубину
- •4.3.2. Обход в ширину
- •4.4. Поиск остовного дерева минимального веса
- •4.4.1. Алгоритм Дейкстры – Прима
- •4.4.2. Алгоритм Крускала
- •4.5. Алгоритм поиска кратчайшего пути
- •4.6. Вопросы для самоконтроля
- •Структуры данных для представления графов.
- •5. Численные методы
- •5.1. Вычисление значений многочленов
- •5.2. Умножение матриц
- •5.2.1 Стандартный алгоритм умножения матриц
- •5.2.2. Умножение матриц по Винограду
- •5.2.3. Умножение матриц по Штрассену
- •5.3. Вопросы для самоконтроля
- •Стандартный алгоритм умножения матриц.
- •6. Алгоритмы сравнения с образцами
- •6.1. Сравнение строк
- •6.2. Алгоритм Кнута – Морриса – Пратта
- •6.3. Алгоритм Бойера - Мура
- •6.4. Вопросы для самоконтроля
- •7. Вычислительная геометрия
- •7.1. Основные понятия
- •7.2. Векторное произведение векторов
- •7.2.1. Ориентированная площадь треугольника
- •7 .3. Задача о выпуклой оболочке
- •7.3.1. Алгоритм Грэхема
- •7.3.2. Алгоритм Джарвиса
- •7.3.3. Рекурсивный алгоритм
- •7.4. Вопросы для самоконтроля
- •8. Задачи класса np
- •8.1. Примеры np-полных задач
- •8.1.1. Задача о коммивояжере
- •8.1.2. Задача о раскраске графа
- •8.1.3. Раскладка по ящикам
- •8.1.4 Упаковка рюкзака
- •8.1.5. Задача о суммах элементов подмножества
- •8.1.6. Задача о планировании работ
- •8.2. Приближенные эвристические решения nр-полных задач.
- •8.2.1. Жадные приближенные алгоритмы
- •8.2.2. Приближения в задаче коммивояжера
- •8.2.3. Приближения в задаче о раскладке по ящикам
- •8.2.4. Приближения в задаче об упаковке рюкзака
- •8.3. Вопросы для самопроверки
- •Приближения в задаче об упаковке рюкзака.
- •9. Динамическое программирование
- •Часть1--------------------
- •10. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
7 .3. Задача о выпуклой оболочке
На плоскости задано множество S, состоящее из N точек. Требуется построить выпуклую оболочку, то есть определить точки, соединяя которые линиями, мы получаем охватывающий выпуклый контур.
7.3.1. Алгоритм Грэхема
Т ройки последовательно идущих точек проверяются в порядке обхода против часовой стрелки. Если обход выполняется против часовой стрелки, то точки образуют левый поворот, если по часовой стрелке, то правый поворот. Так, например, для точек на рис.7.6 левый поворот образован точками (1,2,3), (2,3,4), (4,5,1), а правый – (3,4,5).
Основная идея алгоритма Грэхема:
найти внутреннюю точку t;
используя t как начало координат, отсортировать точки множества S по неубыванию в соответствии с полярным углом и расстоянием от t;
выполнить обход точек, исключая точки, образующие правый поворот.
Эту идею можно упростить – найти не внутреннюю точку, а самую левую верхнюю. Она заведомо принадлежит выпуклой оболочке. При этом значения углов вычисляются относительно этой точки.
Фрагменты алгоритма.
Grehеm (N, A, M)
// N – число точек
// A(N) array of Point – массив точек (координаты)
// M – количество точек в выпуклой оболочке
// Ls(N) – номера точек (при инициализации ls[i]=i)
// bb(N) – логический признак принадлежности точки выпуклой оболочке
// Rd(N) – оценки полярных углов
// 1 этап – поиск самой левой верхней точки
j1
for i=2 to N do
if (A[j].x>A[i].x) OR (A[i].x=A[j].x AND A[i].y>A[j].y)
then j=i
endif
endfor
// делаем крайнюю левую точкой первой
Swap (A[1], A[j])
Swap (Ls[1], Ls[j])
// на первом месте стоит левая верхняя точка
// далее определяем синусы углов. Углы принадлежат первой и четвер- // той четверти. Если углы задать в диапазоне [-90, 90] и отсортиро- // вать в порядке неубывания, то выпуклую оболочку можно построить // обходом против часовой стрелки
for i=2 to N do
dxA[i].x-A[1].x; dyA[i].y-A[1].y
Rd[i]dy/Sqrt(dx^2+dy^2)
еndfor
// далее некоторой сортировкой упорядочиваем углы. Только необходи- // мо не забывать одновременно с перестановкой ключа Rd[i] перестав- // лять и соответствующие элементы в массивах Ls и А
Sort(Rd, N)
// если число точек больше 3, то выполняем обход точек в поисках // выпуклой оболочки
If N>3 then Rounds
endif
end
//Процедура обхода точек
Procedure Rounds
MN // количество точек в выпуклой оболочке
LfA[1]; mdA[2]; rgA[3] // выбираем 3 точки обхода
Lfi1; mdi2; rgi3; // запоминаем индексы точек
While rgi<> 1 do
// определяем ориентированную площадь
RSorient(lf, md, rg)
If R<0 then // исключаем точку с номером mdi из выпуклой оболочки
Bb[mdi]false; M=M-1; mdirgi; mdrg; rgirgi mod N +1; rgA[rgi]
Else // переходим к следующей точке, если ориентация // нормальная
Lfimdi; lfmd; mdirgi; mdrg;
Rgirgi mod N+1; rgA[rgi]
еndif
еndwhile
еnd