Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Чет про программирование / 20) Оценка времени работы алгоритма

.docx
Скачиваний:
42
Добавлен:
25.04.2015
Размер:
15.06 Кб
Скачать

Оценка времени работы алгоритма

Алгоритм – формальная вычислительная процедура, т.е. последовательность шагов, которая получает результат по входным данным.

Программа – реализация алгоритма.

При анализе алгоритма нас в первую очередь волнует его трудоемкость, т.е. время выполнения алгоритма на компьютере. Очевидно, что этот показатель напрямую зависит от конкретного компьютера, поэтому чтобы сделать наши вычисления о трудоемкости алгоритмов более универсальными, будет считать, что все вычисления проводятся на некой абстрактной машине. RAM-машина – абстрактный исполнитель, используемый для анализа алгоритмов, способный выполнять некие элементарные действия.

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

Размер или количество входных данных – есть размерность данных.

Определим сложность алгоритма как функцию Т от размерности данных n. Эта функция ставит каждому n в соответствие наибольшее время T(n) работы алгоритма при входных данных размерности n.

Таким образом, анализ времени работы алгоритма сводится к вопросу: как быстро растет функция T при бесконечно растущем значении n. Иными словами, нас интересует асимптотическая сложность алгоритма.

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

Нотации О, Омега и Тетта

Функция f(n) = O(g(n))  существуют C, N такие, что для любых n > N: f(n) < C * g(n). Или предел отношения функций f(n)/g(n) при n стремящемся к бесконечности <= C.

В этом случае, g(n) – асимптотическая оценка СВЕРХУ для функции f(n). Т.е. алгоритм заканчивает свою работу при любых входных данных не более, чем за C * g(n) элементарных операций. O(1) – такой алгоритм не зависит от размера входных данных и всегда выполняется константное количество времени, O(n) – линейный алгоритм, O(N^C) – полиномиальный.

Для оценки СНИЗУ используется обозначение ОМЕГА БОЛЬШОЕ. Функция f(n) = Omega(g(n))  существуют C, N такие, что для любых n > N: f(n) >= C * g(n).

Чтобы точно указать порядок роста функции, не давая точных значений констант, используется обозначение Тетта Большое. F(n) = Theta(g(n))  существуют N, C1, C2 такие, что для любых n > N: C1 * g(n) <= f(n) <= C2 * g(n). Такая запись включает в себя сразу 2 оценки – сверху и снизу, т.е. начиная с некоторого N скорость роста функции g(n) полностью соответствует росту функции f(n).

Оценка времени работы алгоритмов

Время работы алгоритма может быть оценено в худшем случае (сверху), в лучшем случае (снизу) и в среднем случае. Однако очень часто время работы в худшем и среднем случае мало отличается.

Среднее время работы – усредненное время работы алгоритма по всем входным данным размерности n. Т.е. в среднем случае мы рассматриваем различные входные данные как равновероятные.