- •Тема 1. Основные понятия и определения дисциплины.
- •1.1 История развития теории алгоритмов.
- •1.2 Роль алгоритмов в науке и технике.
- •1.3 Понятие алгоритма.
- •1.4 Алгоритмический процесс.
- •1.5 Алгоритмы и языки.
- •1.6 Основные вопросы теории алгоритмов.
- •1.7 Классификация алгоритмов.
- •1.8 Свойства алгоритмов.
- •1.9 Методы доказательства корректности алгоритмов.
- •1.10 Сложность алгоритмов.
- •Можно показать, что нижняя граница
- •Сложность рекурсивных алгоритмов.
- •Тема 2. Традиционные подходы в теории алгоритмов.
- •2.1 Рекурсивные функции.
- •Операторы рекурсии.
- •2.2 Нормальные алгорифмы Маркова.
- •2.3 Машина Тьюринга.
- •Тема 3 Алгоритмически неразрешимые проблемы
- •Тема 4 Классы p- (polynomial) и np- (nondeterminated polynomial) задач.
- •4.1 Понятие р- и np-задач.
- •4.3 Примеры задач np-класса.
1.10 Сложность алгоритмов.
Временная сложность алгоритма (T(N), где N – размер задачи) – это время выполнения алгоритма, измеренное в шагах (инструкциях алгоритма, которые нужно выполнять для достижения результата). Т. е. это – число элементарных операций, из которых складывается алгоритм решения задачи (:=, <>, =, +, –, *, /; and, or, not, xor; call, return).
Различают три разновидности временной сложности, которые зависят от комбинации входных данных при решении задачи (равнозначность, разряженность, упорядоченность и др. свойства входных данных).
Worst Case – максимальное время выполнения (наихудший возможный случай).
Average Case – среднее время выполнения (в статистическом смысле).
Best Case – минимальное время (наилучший случай).
На практике оперируют максимальным временем выполнения алгоритма.
Пример 1:
Сложность алгоритма умножения матрицы на вектор порядка N может быть записана:
Случай T(N)=C*N2 применим для квадратной матрицы.
Элементарные операции в данном случае – совокупность «+» и «*».
Если исходная матрица – единичная, то получаем Best Case.
Если в матрице половина элементов – 0, половина – 1, то получаем Average Case.
Константа С, которая не может быть точно выражена, характеризует влияние внешних факторов на время выполнения алгоритмов (быстродействие ЭВМ, скорость компиляции). Поэтому использование единиц времени для оценки временной сложности алгоритмов не совсем корректно. В этом случае говорят, что временная сложность алгоритма умножения матрицы на вектор пропорциональна N2.
Характер поведения временной сложности при увеличении N (N) называется асимптотической сложностью алгоритма.
Для описания скорости роста асимптотической сложности используется О-нотация. Когда говорят, что временная сложность алгоритма имеет порядок N2:
T(N)=O(N2)=O(f(N)),
То подразумевается, что существуют положительные константы C, n0=const (C>0), такие, что для всех N N0 выполняется неравенство
T(N) C*f(N)
(1)
Это – верхняя граница оценки сложности.
Пример 2:
Пусть Т(0)=1, Т(1)=4, …, Т(N)=(N+1)2, тогда временная сложность этого алгоритма имеет порядок роста T(N)=O(N2).
Можно показать, что для всех N > n0 при n0 = 1, C = 4 выполняется неравенство (1).
(N+1)2 4*N2
Пример 3:
Если временная сложность записывается в виде полинома
T(N)=C1N2+C2N+C3,
то такой алгоритм имеет порядок сложности, кратный степени максимального элемента полинома, т. к. он растет наиболее быстро при N:
T(N)=O(N2).
Например:
3n2+5n+1 5n2
n 1
Пример 4:
Если некоторый алгоритм имеет сложность, кратную 3n, тогда можно показать, что порядок роста скорости не может быть кратен O(2n):
T(N)=3n O(2n).
Пусть существуют константы C, n0, такие, что выполняются неравенство:
3n C*2n, n n0.
Отсюда получаем:
С (3/2)2, n n0.
Но при n не существует такой константы С, которая удовлетворяла бы данному неравенству.
Кроме верхней границы сложности существует и нижняя граница скорости роста временной сложности:
T(N) (f(N))
(2)
Неравенство (2) подразумевает, что существует некоторая константа С, для которой при N временная сложность
T(N) C*f(N).
Учитывая сложность точного определения T(N) (асимптотической временной сложности), в зависимости от размеров исходных данных на практике используют нижние и верхние границы временной сложности алгоритма:
T(N) = (f(N))
В зависимости от значения константы С скорость роста сложности алгоритма может существенно меняться.
Пример 5:
Пусть временная сложность записывается формулой
T(N)=3n2 –100n+6=O(n2)
3n2 >3n2 –100n+6, n1, C=3.
Если С10 (С1=0,00001), тогда неравенство
10-5n2 > 3n2 –100n+6, n1
не выполняется.
Но можно показать, что порядок роста сложности
3n2 –100n+6 O(N).
C*N < 3N2, N>C.
3n2 –100n+6=(n2)
C=2.29, n n0.
2.99*n2 < 3n2 –100n+6