- •Содержание
- •Введение.
- •1. Основы анализа алгоритмов
- •1.1. Сравнительные оценки алгоритмов
- •1.2. Элементарные операции в формальной системе
- •1.3. Классы входных данных
- •1.4. Классификация алгоритмов по виду функции трудоемкости
- •1.5. Классификация скоростей роста. Асимптотический анализ функций
- •2. Оценка о (о большое)
- •3. Оценка (Омега)
- •1.6. Эффективность рекурсивных алгоритмов
- •1. Оценка (тета)
- •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. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
4.2. Структуры данных для представления графов
Информацию о графах можно хранить несколькими способами:
в виде матрицы примыканий (смежности);
в виде списка примыканий;
в виде двумерного массива ребер.
Ни один из этих способов не превосходит другой заведомо. В основе выбора должны лежать наши предварительные знания о графах, которые будут обрабатываться алгоритмом.
Если в графе много вершин, и каждая из них связана лишь с небольшим количеством других вершин, список примыканий оказывается выгоднее, поскольку он занимает меньше места, а длина просматриваемого списка ребер – невелика.
Если же число вершин в графе мало, то лучше воспользоваться матрицей смежности: она будет небольшой, и даже потери при хранении в матричном виде будут незначительны.
Если же в графе много ребер, и он почти полный, то матрица смежности всегда является лучшим способом хранения графа.
Различные варианты задания графа, изображенного на рис.4.3, приведены ниже.
М 1 2 3 4 5 6 1 0 1 0 1 1 0 2 1 0 1 0 1 1 3 0 1 0 0 0 0 4 1 0 0 0 0 1 5 1 1 0 0 0 1 6 0 1 0 1 1 0 симметрична для неориентированного графа |
Список примыканий 1 2,4,5 2 1,3,5,6 3 2 4 1,6 5 1,2,6 6 2,4,5 |
Массив ребер
1 1 1 2 2 2 4 5 2 4 5 3 5 6 6 6
|
4.3. Алгоритмы обхода вершин графа
При работе с графами часто приходится выполнять некоторые действия по одному разу с каждой вершиной графа. Например, некоторую информацию следует передать каждому из компьютеров в сети. При этом мы не хотим посещать каждый компьютер дважды. Аналогичная ситуация возникает, если мы хотим собрать информацию, а не распределить ее.
Подобный обход можно совершить двумя различными способами. При обходе в глубину проход по выбранному пути осуществляется настолько глубоко, насколько это возможно, а при обходе в ширину мы равномерно двигаемся вдоль всех возможных направлений.
В обоих случаях мы выбираем одну из вершин графа в качестве отправной точки.
4.3.1. Обход в глубину
При обходе в глубину мы посещаем первый узел, а затем идем вдоль ребер графа, пока не упремся в тупик. Узел неориентированного графа является тупиком, если мы уже посетили все примыкающие к нему узлы. В орграфе тупиком также оказывается узел, из которого нет выходящих ребер.
После попадания в тупик мы возвращаемся назад вдоль пройденного пути, пока не обнаружим вершину, у которой есть еще не посещенный сосед, а затем движемся в этом направлении. Процесс оказывается завершенным, когда мы вернулись в исходную точку, а все примыкающие к ней вершины уже оказались посещенными.
При выборе одной из двух вершин будем выбирать вершину с меньшей меткой.
Н
апример,
для графа на рис.4.4 обход в глубину будет
соответствовать следующему порядку
посещения вершин: 1, 2, 3, 5, 4, 8, 7 тупик;
вернемся к 8 –тупик, возврат к 4 и посетим
9, 6.
Приведем пример алгоритма обхода в глубину:
DepthWay (А, N)
// А – матрица смежностей
// в стеке St хранятся номера просмотренных вершин графа
// уk - указатель стека
// Массив Nnew – Boolean признак того, что вершина просмотрена
V1; yk0; ykyk+1; St[yk]V;
Nnew (V) false;
while yk <> 0 do // пока стек не пустой
t St [yk] // выбор вершины из верхней точки стека
j 1; pp False
Repeat
if A [t, J] <> 0 and Nnew[j] then pp true
else jj+1
// найдена новая вершина рр или все вершины, связанные с данной просмотрены
until pp OR (jN);
if pp then // новая вершина
ykyk+1; S[yk]j; Nnew[j]false
else ykyk-1 // убираем номер вершины из стека
endif
endwhile
end

атрица
смежности