Скорость роста функций

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

Сравнивая некоторую функцию ƒ с некоторым множеством функций, все алгоритмы можно сгруппировать по скорости роста. Существуют три категории:

1) Класс функций, растущих, по крайней мере, так же быстро, как ƒ, обозначается через Ω(ƒ) (читается как «омега большое»). Можно считать, что класс Ω(ƒ) задается указанием свой нижней границы: все функции из него растут, по крайней мере, так же быстро, как ƒ;

2) Класс функций, растущих не быстрее ƒ, обозначается O. Функция ƒ образует верхнюю границу для класса O (f)(читается как «о большое»);

3) Класс функций, растущих с той же скоростью, что и ƒ, обозначается Q(¦) ( читается как «тэта большое»). С формальной точки зрения этот класс представляет собой пересечение двух предыдущих классов.

Пусть время T (n) работы алгоритма на входах длины n есть Q(n2). Тогда найдутся такие константы c 1, c 2> 0 и такое число n 0, что с 1× n 2T (n) ≤ с 2× n 2 при всех nn 0. Проще говоря, начиная с некоторого размера входа n 0, функциональная зависимость T (n) может быть описана посредством n 2 с точностью до константы, при этом «вилка» или диапазон возможных значений константы, способной обеспечить полное соответствие описания оригиналу, задается при помощи c 1 и c 2. Вообще, если g (n) – некоторая функция, то запись f (n) = Q(g (n)) означает, что найдутся такие c 1, c 2 > 0 и такое n 0, что 0 ≤ с 1× g (n) ≤ f (n) ≤ c 2× g (n) для всех nn 0. Запись f (n) = Q(g (n)) читается так: «эф от эн есть тэта от же от эн».

Следует также упомянуть, что если f 1(n) = Q(g (n)) и f 2(n) = Q(g (n)), то отсюда не следует f 1(n) = f 2(n)!

Определение Q(g (n)) предполагает, что функции f (n) и g (n) асимптотически неотрицательны (asymptotically nonnegative), т.е. неотрицательны для достаточно больших значений n. Если функции f и g строго положительны, то можно исключить n 0 из определения (изменив константы c1 и c2 так, чтобы для малых n неравенство также выполнялось).

Если f (n) = Q(g (n)) то говорят, что g (n) является асимптотически точной оценкой (asymptotically tight bound) для f (n). На самом деле это отношение симметрично: из f (n) = Q(g (n)) следует g (n) = Q(f (n)).

Рисунок 1.1 – Иллюстрации к определениям f (n) = Q(g(n)), f (n) = O(g(n)) и f (n) = W(g(n))

Запись f (n) = Q(g (n)) включает в себя две оценки: верхнюю и нижнюю. Их можно разделить. Говорят, что f (n) = O (g (n)), если найдется такая константа c > 0 и такое число n0, что 0 ≤ f (n) ≤ c × g (n) для всех nn 0. Говорят, что f (n) = W(g (n)), если найдется такая константа c > 0 и такое число n 0, что 0 ≤ c × g (n) ≤ f (n) для всех nn 0. Эти записи читаются так: «эф от эн есть о большое от же от эн», «эф от эн есть есть омега большая от же от эн».


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  




Подборка статей по вашей теме: