PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Какие сложности алгоритмов кроме линейной встречаются чаще всего и как с ними работать?

Продвинутые темы

Сложности кроме линейной O(n): O(1) константная, O(log n) логарифмическая, O(n log n), O(n²) квадратичная, O(2ⁿ) экспоненциальная. Работают с ними, выбирая эффективные алгоритмы и структуры.

Классы сложности

O(1) — константная

Не зависит от размера (доступ по индексу, Map.get, Set.has). Идеал — стремиться к этому для частых операций.

O(log n) — логарифмическая

Деление задачи пополам (бинарный поиск). Очень эффективна (миллион → ~20 шагов).

O(n log n)

Эффективные сортировки (merge, quick), «разделяй и властвуй». Практичный предел для сортировок сравнением.

O(n²) — квадратичная

Вложенные циклы по данным. Проблема на больших данных — избегать/оптимизировать.

O(2ⁿ), O(n!) — экспоненциальная/факториальная

Перебор подмножеств, наивная рекурсия (Фибоначчи без мемоизации). Критично плохо — только для малых входов или с оптимизацией (DP).

Как работать с высокой сложностью

Заменить структуру данных

O(n²) вложенный поиск → O(n) через хеш-таблицу:

// O(n²): для каждого искать в массиве
// O(n): Map для O(1) доступа
const map = new Map(items.map((i) => [i.id, i]));

Мемоизация / DP

Экспоненциальную рекурсию → полиномиальную кешем:

const fib = memoize((n) => n < 2 ? n : fib(n-1) + fib(n-2)); // O(2ⁿ) → O(n)

Правильный алгоритм

Бинарный поиск (O(log n)) вместо линейного, эффективные сортировки.

Оценивать и профилировать

Знать сложность своего кода, находить узкие места.

Коротко для собеседования

Кроме O(n): O(1) (константа — идеал, Map/Set), O(log n) (бинарный поиск), O(n log n) (сортировки), O(n²) (вложенные циклы — избегать), O(2ⁿ)/O(n!) (перебор, наивная рекурсия — критично). Работают: заменяя структуры (хеш-таблица O(1) вместо вложенного поиска), мемоизацией/DP (экспонента → полином), правильными алгоритмами, профилированием.

Другие вопросы раздела