
- •Содержание
- •Введение.
- •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. Метод ветвей и границ
- •Вопросы к зачету
- •Классификация алгоритмов по виду функции трудоемкости.
- •Приближения в задаче об упаковке рюкзака.
- •Динамическое программирование
- •Метод ветвей и границ. Литература
1.7. Анализ программ
Пусть у нас есть программа (большая и сложная), которая работает медленнее, чем хотелось бы. Как обнаружить части программы, тонкая настройка которых привела бы к заметному ускорению ее работы?
Можно посмотреть на программу и найти подпрограммы, в которых много вычислений или циклов и попытаться усовершенствовать их.
Но лучше сначала отобрать часто используемые подпрограммы и попробовать улучшить их.
Один из способов поиска состоит в том, чтобы ввести набор глобальных счетчиков, по одному на каждую подпрограмму. При начале работы все счетчики обнуляются. Затем в каждую подпрограмму первой строкой вставляется команда увеличения счетчика на 1. В конце работы набор счетчиков укажет, сколько раз происходил вызов каждой подпрограммы.
Всегда эффективнее улучшить работу наиболее часто вызываемых подпрограмм.
Счетчики можно использовать и на уровне подпрограмм. В этом случае необходимо установить счетчики в каждой значимой точке (вхождения в цикл, ветвления, if then/ else).
В конце работы установленные счетчики будут содержать информацию о количестве выполнения каждого блока подпрограммы. Затем можно исследовать возможность улучшить те части подпрограммы, которые выполняют максимальный объем работы.
1.8. Вопросы для самоконтроля
Понятие трудоемкости алгоритма в формальном базисе.
Обобщенный критерий оценки качества алгоритма.
Расположить в порядке возрастания следующие функции: 2n , log2n, n2, (log2n)2 , n!, (n-n2+5n3), n3 , , n, 2n-1log2 n
Система обозначений в анализе алгоритмов - худший, лучший и средний случаи.
Классификация алгоритмов по виду функции трудоемкости.
Примеры количественных и параметрически–зависимых алгоритмов.
Обозначения в асимптотическом анализе функций.
Трудоемкость рекурсивных алгоритмов.
Пусть непосредственное (нерекуррентное) вычисление решает некоторую задачу за n2 операций. Рекурсивному алгоритму при решении той же задачи требуется nlog2 n операций для разбиения на 2 равные части входных данных и log2 n – для объединения двух решений. Какой из двух алгоритмов более эффективен?
2. Алгоритмы поиска и выборки
Поиск необходимой информации в списке – одна из фундаментальных задач теоретического программирования, имеющая широкий диапазон практического использования.
При обсуждении алгоритмов поиска предполагаем, что информация содержится в записях, составляющих некоторый список, который представляет собой массив данных. Записи, или элементы списка, идут в массиве последовательно, и между ними нет промежутков. Записи в списке пронумерованы от 1 до N. В принципе записи состоят из нескольких полей. Однако нас будут интересовать значения лишь одного из этих полей, называемого ключом.
Списки могут быть неотсортированными или отсортированными по значению ключевого поля. В неотсортированном списке порядок записи случаен, а в отсортированном списке они идут в порядке возрастания ключа.
В задаче поиска нас интересует процесс просмотра списка в поисках некоторого конкретного элемента, называемого целевым.
В задаче выборки требуется найти элемент, удовлетворяющий некоторым условиям (например, пятый по величине элемент, седьмой с конца, элемент со средним значением и т.п.).