Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
104
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

Министерство науки и образования

Российской Федерации

Московская государственная академия

приборостроения и информатики

Ульянов М.В., Родина Н.В.

Разработка эффективных алгоритмов

Учебное пособие

Москва

2004

УДК

ББК

Разработка эффективных алгоритмов: Учеб. пособие,/ Ульянов М.В., Н.В. Родина; МГАПИ, 2004. – 112 с. ISBN

Предлагаемое издание рекомендуется в качестве учебного пособия для подготовки студентов различных специальностей, изучающих вопросы разработки алгоритмов и анализа их эффективности. Для студентов, обучающихся по специальности 22.01, может использоваться как учебное пособие по дополнительной дисциплине «Разработка эффективных алгоритмов».

Рассматриваются основы асимптотического анализа сложности алгоритмов. Практический сравнительный анализ вычислительных алгоритмов проводится на подробных примерах, иллюстрирующих возможные подходы к решению широкого круга прикладных задач.

Табл. 6 , Ил. 24 . Библиограф.: 6 назв.

Печатается по решению Редакционно-издательского совета Московской государственной академии приборостроения и информатики.

Рекомендовано Ученым Советом МГАПИ в качестве учебного пособия по специальности 22.01.

Научный редактор:

Рецензенты:

 Ульянов М.В., Родина Н.В., 2004

Содержание

Содержание 4

Введение. 6

1. Основы анализа алгоритмов 7

1.1. Сравнительные оценки алгоритмов 7

1.2. Элементарные операции в формальной системе 9

1.3. Классы входных данных 12

1.4. Классификация алгоритмов по виду функции трудоемкости 16

1.5. Классификация скоростей роста. Асимптотический анализ функций 18

1.6. Эффективность рекурсивных алгоритмов 22

1.7. Анализ программ 25

1.8. Вопросы для самоконтроля 26

2. Алгоритмы поиска и выборки 27

2.1. Последовательный поиск 27

2.2. Двоичный поиск 29

2.3. Задача выборки 31

2.4. Вопросы для самоконтроля 34

3.Алгоритмы сортировки 35

3.1. Сортировка трех чисел по месту 35

3.2. Сортировка вставками 36

3.3. Пузырьковая сортировка 38

3.4. Сортировка Шелла. 41

3.5. Корневая сортировка 42

3.6. Сортировка методом индексов 45

3.7. Быстрая сортировка (алгоритм Хоара) 47

3.8. Вопросы для самоконтроля 48

4. Алгоритмы на графах 49

4.1. Основные понятия теории графов 49

4.2. Структуры данных для представления графов 51

4.3. Алгоритмы обхода вершин графа 52

4.3.1. Обход в глубину 52

4.3.2. Обход в ширину 54

4.4. Поиск остовного дерева минимального веса 55

4.4.1. Алгоритм Дейкстры – Прима 55

4.4.2. Алгоритм Крускала 58

4.5. Алгоритм поиска кратчайшего пути 60

4.6. Вопросы для самоконтроля 63

5. Численные методы 64

5.1. Вычисление значений многочленов 65

5.2. Умножение матриц 66

5.2.1 Стандартный алгоритм умножения матриц 66

5.2.2. Умножение матриц по Винограду 67

5.2.3. Умножение матриц по Штрассену 69

5.3. Вопросы для самоконтроля 70

6. Алгоритмы сравнения с образцами 71

6.1. Сравнение строк 71

6.2. Алгоритм Кнута – Морриса – Пратта 72

6.3. Алгоритм Бойера - Мура 73

6.4. Вопросы для самоконтроля 74

7. Вычислительная геометрия 75

7.1. Основные понятия 75

7.2. Векторное произведение векторов 75

7.2.1. Ориентированная площадь треугольника 77

7.3. Задача о выпуклой оболочке 78

7.3.1. Алгоритм Грэхема 79

7.3.2. Алгоритм Джарвиса 81

7.3.3. Рекурсивный алгоритм 81

7.4. Вопросы для самоконтроля 82

8. Задачи класса NP 84

8.1. Примеры NP-полных задач 86

8.1.1. Задача о коммивояжере 86

8.1.2. Задача о раскраске графа 87

8.1.3. Раскладка по ящикам 88

8.1.4 Упаковка рюкзака 88

8.1.5. Задача о суммах элементов подмножества 89

8.1.6. Задача о планировании работ 89

8.2. Приближенные эвристические решения NР-полных задач. 89

8.2.1. Жадные приближенные алгоритмы 89

8.2.2. Приближения в задаче коммивояжера 90

8.2.3. Приближения в задаче о раскладке по ящикам 92

8.2.4. Приближения в задаче об упаковке рюкзака 94

8.3. Вопросы для самопроверки 95

9. Динамическое программирование 97

10. Метод ветвей и границ 101

Вопросы к зачету 114

Литература 116

Введение.

Анализ современных коммерческих программных продуктов показывает, что их разработчики не обращают должного внимания ни на временную эффективность, ни на разумное использование памяти. Они полагают, что если программная система требует значительной памяти, то пользователь просто купит дополнительную память; если она слишком долго работает - то он может купить более быстрый компьютер.

Однако быстродействие компьютера не может увеличиваться бесконечно. Оно ограничено, например, подвижностью электронов в кремнии, скоростью распространения света по оптоволокну и скоростью коммутации каналов связи компьютеров, участвующих в вычислениях.

Другие ограничения связаны не с производительностью, а непосредственно со сложностью решаемой задачи. Есть задачи, для решения которых не хватит человеческой жизни, даже если при этом будут использованы самые быстрые из известных алгоритмов, следовательно, необходимы алгоритмы получения приблизительных ответов.

В начале 80-х годов архитектура компьютеров серьезно ограничивала их скорость и объем памяти. Зачастую общий размер программ и данных не превышал 64 КБ. У современных ПК эта величина выросла в несколько тысяч раз. Нынешнее программное обеспечение гораздо сложнее, чем в 1980 гг., и быстродействие компьютеров также выросло на порядки, но это не повод игнорировать вопросы эффективности программ при их разработке.

В спецификации некоторых проектов включены ограничения на время выполнения и использование памяти конечным программным продуктом, которые могут побудить программистов экономить память и увеличивать скорость выполнения. Небольшие размеры карманных компьютеров также накладывают ограничения на размеры и скорость выполнения программ.

Основная задача дисциплины – понять, как алгоритмы влияют на эффективность программы, и как анализировать разнообразные алгоритмы.