Содержание:
- Описание
- Omega-O
- Theta-O. Asymptotically Tight Bound
- Big-O
- Sharp bound
- Little-O, Little-Omega
- Пределы
- Как произносить асимптотические оценки на английском
- Полезные ресурсы
Формальное определение всех O-нотаций:
При оценке алгоритмов нам понадобятся O-нотации, чтобы определять эффективность алгоритма в плане скорости работы или требуемой дополнительной памяти. Важно понять, что эти обозначения не сообщают точной времени работы алгоритма - они лишь показывают порядок роста (order of growth) времени или памяти в зависимости от входных данных.
В зависимости от нотации, мы можем сказать нижнюю, верхнюю или обе границы порядка роста функции. Так, Big-O сообщает верхнюю, Big-Omega - нижнюю, а Big-Theta ограничивает функцию как сверху, так и снизу.
Таким образом, O-нотация разделяет алгоритмы на классы эффективности, например:
Здесь
Как же нам оценить время работы алгоритма в терминах O-нотации? Для этого нам нужно составить функцию, которая считает точное количество операций алгоритма.
Например, в Википедии хорошо разобран алгоритм "Сортировка вставками" - приведу скриншот из статьи.
Не пугайтесь: под спойлером разобрано очень подробно, но на самом деле все проще. Достаточно изучив и поняв эту тему, вы сможете интуитивно вычислять время работы, понимая что делает каждый шаг алгоритма.
Как я уже сказал, используя асимптотические обозначения, мы хотим показать порядок роста функции. Что это значит на деле? Это значит, что мы отбрасываем:
- Недоминирующие (non-dominant) слагаемые из функции: меньшие степени и константы
- Константные множители
Например, если мы оценили, что количество операций алгоритма можно описать такой функцией:
Дело в том, что на достаточно больших входных данных все эти множители и не доминирующие слагаемые перестают играть значимую роль, становятся пренебрежимо малыми по сравнению с бОльшими слагаемыми и множителями. А как мы помним, асимптотика дает оценку роста функции как раз при стремлении ее аргумента к бесконечному числу.
Например, давайте сравним рост функций
Да, первая функция пока что обходит вторую. А теперь давайте возьмем масштаб поменьше и посмотрим на их рост еще раз:
Мы видим, что их графики уже сравнялись и совершенно не отличимы. Да, конечно, первая функция будет все еще больше, но вопрос в том, насколько значительно. Здесь мы понимаем, что на достаточно больших n основную роль играет только доминирующее слагаемое.
Таким образом, мы говорим, что функция
Когда мы даем асимптотическую оценку, мы не указываем основание логарифма.
Это потому, что нам важно только поведение функции: константное, логарифмическое или линейное. Не важно, какое основание логарифма, важно то, что асимптотически логарифмическое время всегда лучше линейного.
Мы используем
То есть, если сложность алгоритма
Мы используем
Так, если сложность алгоритма
Верно, что если
И верно обратное: если
Мы используем
Зачастую мы используем как раз Big-O, так как нам интересно только максимальное время работы алгоритма - не путать с лучшим и худшим случаем входных данных.
Например, мы знаем что в худшем случае бинарный поиск работает за время
То есть, используя Big-O, мы хотим сказать: время выполнения растет как максимум таким образом, но может расти и медленнее.
Так, если время выполнения
Верно, что время работы бинарного поиска можно описать как
Обычно, когда мы используем Big-O или Big-Omega нотации, мы стараемся давать максимально точные асимптотические оценки (sharp bound, tightest bound). То есть такую оценку, которая точно ограничивает время работы функции
Little-O (
Таким образом, в случае Little-O сравниваемая функция
Очевидно, что Little-Theta не существует.
Можно рассмотреть O-нотации с точки зрения пределов.
Если взять две функции
-
$0$ , если$f(n)$ имеет меньший порядок роста, чем$g(n)$ -
$c$ , если$f(n)$ имеет тот же порядок роста, что и$g(n)$ -
$\infty$ , если$f(n)$ имеет больший порядок роста, чем$g(n)$
Тогда для Big-O нотаций верно:
- Для двух первых случаев:
$f(n) = O(g(n))$ - Для двух последних случаев:
$f(n) = \Omega(g(n))$ - Для второго случая:
$f(n) = \Theta(g(n))$
А для Little-O нотаций верно:
- Для первого случая:
$f(n) - o(g(n))$ - для третьего случая:
$f(n) - \omega(g(n))$
Это я взял из книги "Алгоритмы. Введение в разработку и анализ. А. Левитин" - вот выдержка из нее:
- Сами нотация так и произносятся - Big-O(h), Big-Omega, Big-Theta
- Как давать оценки:
-
$O(1)$ - big oh of one; constant time -
$O(\log n)$ - big oh of log n; logarithmic -
$O(n)$ - big oh of N; linear time -
$O(n^2)$ - big oh of n squared; quadratic -
$O(2^n)$ - big oh of power of two; exponential
-
- Случаи: worst case, best case, average case
- Полезный сайт с оценками всех популярных алгоритмов - https://www.bigocheatsheet.com/
- В этой директории есть файл
o_O.pdf- это конспект уроков линейной алгебры и математического анализа из ВШЭ - Книга "Алгоритмы. Введение в разработку и анализ" - А. Левитин
- Wiki: Асимптотический анализ
- Wiki: «O» большое и «o» малое
- Wiki: Асимптота







.png)