- •Введение
- •1. Элементы теории множеств
- •1.1.Понятие множества.
- •1.2. Способы задания множеств.
- •1.3. Свойства множеств.
- •1.4. Конечные и бесконечные множества.
- •1.5. Подмножества.
- •1.6. Множество как абстракция.
- •1.7. Операции над множествами.
- •1.8.Декартово произведение множеств
- •1.9. Контрольные задания
- •2. Отношения
- •2.1. Общие положения
- •2.2. Задание отношений.
- •2.3. Виды отношений.
- •2.3.1. Рефлективность.
- •2.3.2. Симметричность.
- •2.3.3. Транзитивность.
- •2.4. Отношение эквивалентности
- •2.5. Функция.
- •2.6. Отношение как базовое понятие в реляционных
- •2.7. Контрольные задания
- •3. Элементы алгебры логики
- •3.1. Силлогизмы Аристотеля.
- •3.2. Высказывания.
- •3.3. Исчисление высказываний и
- •3.4. Функции алгебры логики
- •3.5. Равносильности алгебры логики
- •3.6. Одна логическая задача
- •3.7. Реализация функций в элементных базисах
- •3.9. Совершенная конъюнктивная нормальная форма
- •3.10. Реализация операции суммирования в компьютере
- •3.11. Контрольные задания
- •4. Элементы теории графов
- •4.1. История возникновения
- •4.2. Основные понятия
- •4.3. Матрицы графа
- •4.4. Деревья
- •4.5. Раскраска
- •5. Элементы теории алгоритмов
- •5.1. Интуитивное понятие алгоритма
- •5.2. Свойства алгоритмов
- •5.3. Вычислительные и комбинаторные алгоритмы
- •5.5. Асимптотические оценки сложности алгоритма
- •Порядки сложности алгоритма
- •5.6. Комбинаторный взрыв
- •6. Полиномиальные алгоритмы
- •6.1. Построение минимального остовного дерева.
- •6.1.1. Жадный алгоритм
- •6.1.2. Алгоритм Прима
- •6.2. Контрольные задания
- •7. Эвристические алгоритмы
- •7.1. Алгоритм последовательной раскраски
- •7.2. Контрольные задания
- •8. Сетевое планирование
- •8.1. Основные понятия
- •8.2 Параметры сетевого планирования
- •8.3. Вычисление параметров сетевого графика
- •8.4. Контрольные задания
- •9. Элементы абстрактной теории автоматов
- •9.1. Определение абстрактного автомата
- •9.2. Методы задания автоматов
- •9.3. Связь между моделями Мили и Мура.
- •9.4.1. Преобразование автомата Мура в автомат Мили
- •9.4.2. Преобразование автомата Мили в автомат Мура
- •9.5. Контрольные задания
- •10. Уточнение понятия алгоритма
- •10.1. Машина Тьюринга
- •Для каждого алгоритма u из класса к1 существует равносильный ему алгоритм l из класса к2.
- •10.2. Нормальный алгоритм Маркова
5.5. Асимптотические оценки сложности алгоритма
Реальное время работы программы на компьютере зависит не только от выбранного алгоритма. В значительной степени оно определяется языком программирования, типом ЭВМ, структурой представления данных, программной реализацией.
Поэтому время счета конкретных задач стараются не использовать в качестве оценки эффективности соответствующего алгоритма, а рассматривают оценку эффективности как функцию от параметров, характеризующих задачу.
Например, если оценивается эффективность алгоритма сортировки числовой последовательности, представленной одномерным массивом, то в качестве параметра берется длина массива n. Если рассматривается алгоритм поиска на графе G(X, U), то в качестве параметра берется либо число вершин n=x, либо число ребер m=U, либо то и другое вместе.
Функция f(n) является функцией порядка g(n) для больших n (f(n)=O[g(n)]), если
Пример. f(n)=3n5+100n4-4n2+6
f(n)=0(n5),
так как
Оценку сложности обозначают буквой F. При этом определяют асимптотическую оценку сложности
Для определения функции F алгоритм разбивают на шаги и пытаются оценить каждый шаг через выбранный параметр (n при сортировке, n или m при поиске на графе).
При сортировке операциями, от которых зависит число шагов алгоритма, будут сравнение и перемещение элементов числовой последовательности. При поиске на графе число шагов будет зависеть от количества рассмотренных вершин и ребер.
Выделены следующие оценки сложности алгоритмов:
1. F(n)=O(n) – линейная оценка
F(n)=O[n log(n)] – логарифмическая оценка
F(n)=O(n2) – квадратичная оценка
F(n)=O(a0nk+a1nk+1+…+ak) – полиномиальная оценка
F(n)=O(an) – экспоненциальная оценка
F(n)=O(n!) – факториальная оценка
F(n)=O(nn) – гиперэкспоненциальная оценка
Все алгоритмы могут быть разделены на два класса. К первому классу относятся алгоритмы, имеющие оценку сложности не выше полиномиальной. Это “практические” алгоритмы. Они пригодны для реализации на компьютере.
Ко второму классу относятся алгоритмы, имеющие экспоненциальную оценку сложности и выше. Эти алгоритмы непригодны для программирования, так как с увеличением n функция F растет очень быстро.
Порядки сложности алгоритма
-
n
n2
n3
2n
1
1
1
2
10
100
1000
1024
15
225
3375
32768
20
400
8000
1048576
25
625
15625
33554432
30
900
27000
>109
В таблице приведено сравнение порядков сложности алгоритма. Хорошо видно, как растет число шагов при увеличении размерности задачи. Из таблицы следует, что при n>20 алгоритмы с экспоненциальной оценкой сложности и выше не пригодны для программной реализации.
Следует отметить, что одним из основных недостатков подобных оценок сложности является их грубость. Действительно, пусть алгоритм А1 решает задачу за 0.1n секунд, а алгоритм А2 – за 100n секунд, то есть алгоритм А2 работает в 1000 раз быстрее алгоритма А1.
Но оценка сложности у них одинакова и равна О(n).
Асимптотические оценки сложности алгоритма пригодны для больших n. Для задач же небольшой размерности одним из способов определения реальной сложности алгоритма являются контрольные прогоны. Например, для задач сортировки они состоят в замерах времени сортировки заданной последовательности различными алгоритмами с последующим сравнением результатов между собой.
