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

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Средний
#Algorithms

Краткий ответ

  • Сложность алгоритма — оценка ресурсов (время, память), необходимых для выполнения в зависимости от размера входных данных.
  • Big O — асимптотическая нотация для описания худшего случая.
  • Основные классы: O(1) — константа, O(log n) — логарифм, O(n) — линейная, O(n²) — квадратичная.
  • Временная сложность — время выполнения; пространственная — потребление памяти.

Полный ответ

Что такое сложность

Сложность алгоритма показывает, как растёт потребление ресурсов (времени или памяти) при увеличении размера входных данных n.

Big O нотация

Описывает верхнюю границу роста функции, игнорируя константы и младшие слагаемые:

  • O(1) — константное время, не зависит от n.
  • O(log n) — логарифмическое, например бинарный поиск.
  • O(n) — линейное, проход по массиву.
  • O(n log n) — например, эффективная сортировка.
  • O(n²) — квадратичное, вложенные циклы.

Мини‑примеры

O(1) — доступ к элементу:

arr[0]; // всегда одна операция

O(n) — поиск в массиве:

arr.find(x => x === target); // до n сравнений

O(n²) — вложенные циклы:

for (let i = 0; i < n; i++) {
  for (let j = 0; j < n; j++) {
    // n × n операций
  }
}

Временная vs пространственная

  • Временная — количество операций.
  • Пространственная — объём дополнительной памяти.

Пример: рекурсивный Фибоначчи имеет O(2ⁿ) по времени и O(n) по памяти (стек вызовов).

Практическое применение

  • Выбор структур данных: массив vs хеш‑таблица.
  • Оптимизация узких мест в коде.
  • Оценка масштабируемости решения.

Частые ошибки

  • Путать средний и худший случай.
  • Игнорировать константы в реальных задачах.
  • Преждевременная оптимизация без измерений.