О-большое (Big O) — это математическая нотация, которая используется для оценки эффективности алгоритмов, а именно того, как быстро увеличивается время выполнения или объем используемой памяти алгоритма при росте размера входных данных

Основные обозначения сложности алгоритмов

ОбозначениеНазваниеОписание и пример
O(1)КонстантнаяВремя не зависит от размера входных данных. Пример: доступ к элементу массива по индексу.
O(log n)ЛогарифмическаяВремя растёт медленно, пропорционально логарифму размера входа. Пример: бинарный поиск.
O(√n)КорневаяВремя растёт пропорционально корню из размера входа. Пример: перебор делителей числа.
O(n)ЛинейнаяВремя растёт прямо пропорционально размеру входа. Пример: проход по массиву.
O(n log n)Линейно-логарифмическаяБыстрее квадратичной, но медленнее линейной. Пример: сортировка слиянием, быстрая сортировка.
O(n²)КвадратичнаяВремя пропорционально квадрату размера входа. Пример: сортировка пузырьком, вложенные циклы.
O(n³)КубическаяВремя пропорционально кубу размера входа. Пример: три вложенных цикла.
O(n^k)ПолиномиальнаяВремя пропорционально n в степени k. Пример: вложенные циклы, где k — количество циклов.
O(2ⁿ)ЭкспоненциальнаяВремя удваивается с каждым увеличением входа. Пример: перебор всех подмножеств.
O(n!)ФакториальнаяВремя растёт очень быстро, перебор всех перестановок. Пример: полный перебор маршрутов.
Ω(…)Омега-большоеНижняя граница сложности (лучший случай).
Θ(…)Тета-большоеТочная асимптотика (одновременно верхняя и нижняя граница).

Разбор по классам сложности

  • asymptotic-analysis — практика определения сложности
  • O(1) — константная
  • O(log n) — логарифмическая
  • O(√n) — корневая
  • O(n) — линейная
  • O(n log n) — линейно-логарифмическая
  • O(n²) — квадратичная
  • O(n³) — кубическая
  • O(n^k) — полиномиальная
  • O(2ⁿ) — экспоненциальная
  • O(n!) — факториальная