Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Часть 1.doc
Скачиваний:
6
Добавлен:
18.04.2019
Размер:
1.01 Mб
Скачать

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, такие, что выполняются неравенство:

3­­­­­n 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