Сложность алгоритмов: Big O

↑ 8.3 Алгоритмы и структуры данных · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Без оценки сложности нельзя обсуждать решение. Ожидают, что вы назовёте время и память для каждого решения.

Нотация

Big O описывает, как растёт время или память при росте входа n, отбрасывая константы и младшие слагаемые.

КлассНазваниеПример
O(1)константадоступ по индексу, Map.get
O(log n)логарифмбинарный поиск
O(n)линейнаяобход массива
O(n log n)линейно-логарифмическаяэффективные сортировки
O(n²)квадратдва вложенных цикла
O(2ⁿ)экспонентанаивный перебор подмножеств, наивный Фибоначчи
O(n!)факториалперебор перестановок

Правила подсчёта

  • последовательные блоки складываются: O(n) + O(n²) = O(n²);
  • вложенные — умножаются;
  • две разные переменные: O(a + b), O(a · b);
  • рекурсия: считаем число вызовов и работу в каждом.

Сложности в JS

ОперацияСложность
arr[i], push, popO(1)
shift, unshift, splice в началеO(n)
includes, indexOfO(n)
Map/Set get, set, hasO(1) в среднем
sortO(n log n)
concat, slice, spreadO(n)
Строковая конкатенация в циклеO(n²) в худшем, но движки оптимизируют

Амортизированная сложность

push в динамический массив — O(1) амортизированно: редкие расширения дороги, но распределяются на много операций.

Память

Учитывайте дополнительную память: копия массива, стек рекурсии, хэш-таблица. «На месте» (in-place) — O(1) дополнительной памяти.

Best / Average / Worst

Быстрая сортировка: в среднем O(n log n), в худшем O(n²). Хэш-таблица: в среднем O(1), при коллизиях O(n).

Вопросы с ответами