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

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) – линейная оценка

  1. F(n)=O[n log(n)] – логарифмическая оценка

  2. F(n)=O(n2) – квадратичная оценка

  3. F(n)=O(a0nk+a1nk+1+…+ak) – полиномиальная оценка

  4. F(n)=O(an) – экспоненциальная оценка

  5. F(n)=O(n!) – факториальная оценка

  6. 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. Для задач же небольшой размерности одним из способов определения реальной сложности алгоритма являются контрольные прогоны. Например, для задач сортировки они состоят в замерах времени сортировки заданной последовательности различными алгоритмами с последующим сравнением результатов между собой.