Оценка сложности алгоритмов: O-большое

Что означает O(n), O(log n), O(n²), как считать сложность по коду, таблица сложностей типовых операций и структур данных.

O-большое отвечает на вопрос: как растёт время работы, если размер входа n растёт. Константы и младшие слагаемые отбрасываются — 3n² + 100n + 7 это O(n²), потому что при больших n квадрат съедает всё остальное.

Как считать по коду

  1. Последовательные блоки — берём максимум: O(n) + O(n²) = O(n²).
  2. Вложенные циклы — перемножаем: два цикла по n дают O(n²).
  3. Деление задачи пополам на каждом шаге — это log n (бинарный поиск).
  4. Рекурсия: считаем количество вызовов, а не строк кода.
# O(n) — один проход
for x in a:
    s += x

# O(n^2) — вложенные циклы
for i in range(n):
    for j in range(n):
        m[i][j] = i * j

# O(log n) — область поиска сокращается вдвое
lo, hi = 0, n - 1
while lo <= hi:
    mid = (lo + hi) // 2
    ...

Порядки роста от лучшего к худшему

СложностьНазваниеПример
O(1)КонстантнаяДоступ к элементу массива по индексу
O(log n)ЛогарифмическаяБинарный поиск, вставка в сбалансированное дерево
O(n)ЛинейнаяПроход по массиву, поиск максимума
O(n log n)Линейно-логарифмическаяБыстрая сортировка, сортировка слиянием
O(n²)КвадратичнаяПузырёк, перебор всех пар
O(2ⁿ)ЭкспоненциальнаяПолный перебор подмножеств
O(n!)ФакториальнаяПеребор всех перестановок (задача коммивояжёра в лоб)
Практический ориентир: за 1 секунду успевает примерно 10⁸ простых операций. Значит, O(n²) годится до n ≈ 10 000, а O(2ⁿ) — до n ≈ 25.

Сложность операций над структурами

СтруктураПоискВставкаУдаление
Массив (неотсортированный)O(n)O(1) в конецO(n)
Отсортированный массивO(log n)O(n)O(n)
Связный списокO(n)O(1)O(1) при известном узле
Хеш-таблицаO(1) в среднемO(1) в среднемO(1) в среднем
Сбалансированное деревоO(log n)O(log n)O(log n)
Куча (heap)O(n)O(log n)O(log n) для минимума

Лучший, средний и худший случай

У быстрой сортировки средний случай O(n log n), а худший — O(n²), когда опорный элемент каждый раз оказывается крайним. Поэтому на защите корректно говорить не «сложность quicksort», а «сложность в среднем/в худшем случае» — это как раз то различие, которое проверяют вопросом.

Память тоже считают

Пространственная сложность — сколько дополнительной памяти нужно сверх входных данных. Сортировка слиянием быстрая, но требует O(n) дополнительной памяти, а пирамидальная работает на месте с O(1). В задачах с ограничением по памяти это решающий аргумент.

Частые вопросы

Отбрасывать ли константу 1/2 в n²/2?

Да, в асимптотике константный множитель не влияет на порядок роста. Но в реальном сравнении двух O(n log n)-алгоритмов константа решает.

Что такое амортизированная сложность?

Средняя стоимость операции в длинной серии. У динамического массива вставка иногда стоит O(n) из-за перевыделения, но амортизированно — O(1).

Читайте также

Сделаем работу по этой теме

Опишите задачу — ответим в течение 15 минут в личных сообщениях ВКонтакте, назовём срок и цену. Предоплаты за оценку нет.

  • Оценка заявки бесплатно
  • Правки по замечаниям преподавателя
  • Работы по всем техническим и IT-дисциплинам

Нажимая кнопку, вы соглашаетесь на обработку указанных данных для ответа на заявку.