Чет про программирование / 20) Оценка времени работы алгоритма
.docxОценка времени работы алгоритма
Алгоритм – формальная вычислительная процедура, т.е. последовательность шагов, которая получает результат по входным данным.
Программа – реализация алгоритма.
При анализе алгоритма нас в первую очередь волнует его трудоемкость, т.е. время выполнения алгоритма на компьютере. Очевидно, что этот показатель напрямую зависит от конкретного компьютера, поэтому чтобы сделать наши вычисления о трудоемкости алгоритмов более универсальными, будет считать, что все вычисления проводятся на некой абстрактной машине. 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. Т.е. в среднем случае мы рассматриваем различные входные данные как равновероятные.