
- •Содержание
- •Введение.
- •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. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
8.1. Примеры np-полных задач
8.1.1. Задача о коммивояжере
Задан набор городов и стоимость путешествия между любыми двумя из них. Нужно определить такой порядок, в котором следует посетить все города по одному разу и вернуться в исходный город, чтобы общая стоимость путешествия оказалась минимальной.
8 городов можно упорядочить 8!=40320 способами, а для 10 городов это число возрастает до 3 628 800. Поиск кратчайшего пути требует перебора всех этих возможностей. Предположим, у нас есть алгоритм, способный подсчитать стоимость путешествия через 15 городов в указанном порядке. Если за 1 секунду такой алгоритм способен пропустить через себя 100 вариантов, то ему потребуется больше 4-х веков, чтобы исследовать все возможности и найти кратчайший путь. Если в нашем распоряжении 400 таких компьютеров, то у них уйдет на это год, а ведь мы имеем дело всего лишь с 15 городами.
Ясно, что дешевле и быстрее путешествовать хоть как-нибудь, чем ждать, пока компьютер выдадут оптимальное решение. Можно ли найти кратчайший путь, не просматривая их все? До сих пор никому не удалось придумать алгоритм, который не занимается по существу просмотром всех путей.
Задача о коммивояжере может быть сформулирована как задача на графах. Каждый город можно представить вершиной графа, наличие пути между двумя городами – ребром, а стоимость путешествия – весом ребра.
Отсюда можно сделать вывод о том, что алгоритм поиска кратчайшего пути решает и задачу коммивояжера. Однако это не так. Какие два условия в задаче о коммивояжере отличают ее от задачи кратчайшего пути?
Во-первых, мы должны посетить все города, а алгоритм поиска кратчайшего пути дает лишь путь между двумя заданными городами. Если собрать путь из кратчайших кусков, то он будет проходить через некоторые города по несколько раз.
Во-вторых, требуется вернуться в начальную точку, что не надо в кратчайшем пути.
8.1.2. Задача о раскраске графа
Граф G=(V,E) представляет собой набор вершин V и набор ребер Е, соединяющих вершины попарно. Вершины можно раскрасить в разные цвета, которые обозначаются целыми числами. Необходимо раскрасить граф таким образом, чтобы концы каждого ребра были окрашены в разные цвета. Очевидно, что в графе с N вершинами можно покрасить все вершины в N различных цветов, но можно ли обойтись меньшим количеством? Каково минимальное количество цветов, необходимое для раскраски вершин? Можно ли раскрасить вершины в С или менее цветов?
У задачи раскраски графа есть практическое приложение – составление расписаний. Если каждая вершина графа обозначает читаемый в колледже курс, и вершины соединяются ребром, если есть студенты, слушающие оба курса, то получается весьма сложный граф.
Если предположить, что каждый студент слушает 5 курсов, то на студента приходится 10 ребер. Предположим, что на 3500 студентов приходится 500 курсов. Тогда у получившегося графа будет 500 вершин и 35000 ребер.
Если на экзамены отведено 20 дней, то это означает, что вершины графа должны быть раскрашены в 20 цветов, чтобы ни у одного из студентов не приходилось по 2 экзамена в день.
8.1.3. Раскладка по ящикам
Пусть у нас есть несколько ящиков единичной емкости и набор объектов различного размера S1,S2,..Sn. Найти наименьшее количество ящиков, необходимое для раскладки всех объектов, или ( в другой постановке) можно ли упаковать все объекты в В или менее ящиков.
Эта задача возникает при записи информации на диски или во фрагментированной памяти компьютера; при эффективном распределении груза на кораблях; при вырезании кусков из стандартных порций материала по заказам клиентов.
Верхняя граница числа ящиков m равна n, т.е. mmax=n , если i, j Si+Sj>1. Нижняя граница m это mmin = 1, при условии ∑Si ≤1.