Асимптотика (Big O, Ω, Θ, o)

Асимптотика

  • Асимптотика — оценка роста функции затрат алгоритма (время или память) при увеличении размера входа \(n\).
  • \(f(n)\) — функция затрат алгоритма
  • \(g(n)\) — функция сравнения (например, \(n\), \(n^2\), \(\log n\) и т.д.)

Большое O — \(O(f(n))\)

  • Верхняя граница роста.
  • Алгоритм не будет работать хуже, чем \(O(f(n))\) в худшем случае.
  • Формально:
\[ f(n) = O(g(n)) \iff \exists C>0, n_0 : \forall n \ge n_0, f(n) \le C \cdot g(n) \]
  • Примеры:
    • Линейный поиск → \(O(n)\)
    • Пузырьковая сортировка → \(O(n^2)\)
    • Бинарный поиск → \(O(\log n)\)

Большое Ω — \(\Omega(f(n))\)

  • Нижняя граница роста.
  • Алгоритм будет выполняться как минимум \(\Omega(f(n))\) шагов в лучшем случае.
  • Формально:
\[ f(n) = \Omega(g(n)) \iff \exists C>0, n_0 : \forall n \ge n_0, f(n) \ge C \cdot g(n) \]
  • Пример:
    • Поиск минимума в массиве → \(\Omega(n)\)

4. Большое Θ — \(\Theta(f(n))\)

  • Точная асимптотика.
  • Функция растёт как \(g(n)\) сверху и снизу.
  • Формально:
\[ f(n) = \Theta(g(n)) \iff f(n) = O(g(n)) \text{ и } f(n) = \Omega(g(n)) \]
  • Пример:
    • Сортировка слиянием → \(\Theta(n \log n)\)

5. Малое o — \(o(f(n))\)

  • “Строго меньше”, растёт медленнее, чем \(f(n)\) при \(n \to \infty\)
  • Формально:
\[ f(n) = o(g(n)) \iff \lim_{n \to \infty} \frac{f(n)}{g(n)} = 0 \]
  • Примеры:
    • \(n = o(n^2)\)
    • \(\log n = o(n)\)

Типичные функции роста

Функция Рост
\(O(1)\) константа
\(O(\log n)\) логарифмическая
\(O(n)\) линейная
\(O(n \log n)\) линейно-логарифмическая
\(O(n^2)\) квадратичная
\(O(n^3)\) кубическая
\(O(2^n)\) экспоненциальная
\(O(n!)\) факториальная

Таблица популярных алгоритмов и их асимптотики

Алгоритм / Структура Худший случай \(O\) Лучший случай \(\Omega\) Средний / точный \(\Theta\)
Линейный поиск \(O(n)\) \(\Omega(1)\) \(\Theta(n)\)
Бинарный поиск \(O(\log n)\) \(\Omega(1)\) \(\Theta(\log n)\)
Сортировка пузырьком \(O(n^2)\) \(\Omega(n)\) \(\Theta(n^2)\)
Сортировка вставками \(O(n^2)\) \(\Omega(n)\) \(\Theta(n^2)\)
Сортировка слиянием \(O(n \log n)\) \(\Omega(n \log n)\) \(\Theta(n \log n)\)
Быстрая сортировка (QuickSort) \(O(n^2)\) \(\Omega(n \log n)\) \(\Theta(n \log n)\)
Сортировка кучей (HeapSort) \(O(n \log n)\) \(\Omega(n \log n)\) \(\Theta(n \log n)\)
Поиск минимума в массиве \(O(n)\) \(\Omega(n)\) \(\Theta(n)\)
Минимальное остовное дерево (Краскал) \(O(E \log V)\) \(\Omega(E \log V)\) \(\Theta(E \log V)\)
Минимальное остовное дерево (Прим) \(O(E \log V)\) \(\Omega(E \log V)\) \(\Theta(E \log V)\)
Кратчайший путь (Дейкстра) \(O(V^2)\) / \(O(E+V \log V)\) \(\Omega(V)\) \(\Theta(V^2)\) / \(\Theta(E+V \log V)\)
Кратчайший путь (Флойд) \(O(V^3)\) \(\Omega(V^3)\) \(\Theta(V^3)\)
Динамическое программирование (рюкзак, Фибоначчи) \(O(n^2)\) / \(O(n)\) \(\Omega(n^2)\) / \(\Omega(n)\) \(\Theta(n^2)\) / \(\Theta(n)\)
Рекурсия деления пополам \(O(\log n)\) \(\Omega(\log n)\) \(\Theta(\log n)\)

Легенда:

  • \(V\) — количество вершин графа
  • \(E\) — количество рёбер
  • \(n\) — размер входа (массив, число элементов)

Советы

  • Big \(O\) — худший случай
  • \(\Omega\) — лучший случай
  • \(\Theta\) — средний / точный рост
  • \(o\) — “чуть медленнее”, редко спрашивают, но знать нужно
  • Часто сравнивают функции через предел:
    • \(\lim_{n \to \infty} \frac{f(n)}{g(n)} = 0 \implies f = o(g)\)
    • \(\lim_{n \to \infty} \frac{f(n)}{g(n)} = c \neq 0 \implies f = \Theta(g)\)
    • \(\lim_{n \to \infty} \frac{f(n)}{g(n)} = \infty \implies f = \omega(g)\)
  • Принцип подсчёта:
    • Берём только самую быстрорастущую часть
    • Отбрасываем константы и менее значимые члены
    • Это и есть асимптотическая сложность