Получить доступ

Что такое компромисс между временем и памятью?

JuniorСложность алгоритмов
Ещё спрашивают так:
  • Как ускорить алгоритм за счёт памяти?
  • Что такое мемоизация и кэширование с точки зрения сложности?
Коротко

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

  • Примеры: хеш-множество вместо вложенного цикла, мемоизация, индекс в базе, кэш
  • Сложность по памяти оценивают так же, через O, включая дополнительную память алгоритма

А ещё Выбор зависит от ограничений: памяти мало (встраиваемые системы) или время критично

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

У алгоритма две основные характеристики: время и дополнительная память. Их часто можно обменивать друг на друга.

Память в обмен на время:

  • хеш-множество — проверка «видели ли мы элемент» за O(1) вместо O(n), ценой O(n) памяти. Поиск пары с заданной суммой: O(n²) вложенным циклом или O(n) с множеством;
  • мемоизация — запоминаем результаты функции, чтобы не считать их повторно: числа Фибоначчи из O(2ⁿ) превращаются в O(n);
  • предвычисление — префиксные суммы дают сумму любого отрезка за O(1) после O(n) подготовки;
  • индекс в базе данных — дополнительная структура на диске, но поиск за O(log n) вместо полного просмотра;
  • кэш — хранить готовые ответы на частые запросы.

Время в обмен на память: сортировка на месте (пирамидальная, O(1) памяти) вместо сортировки слиянием (O(n) дополнительной памяти); пересчитывать значение каждый раз вместо хранения; потоковая обработка данных частями, когда всё не помещается в память.

Что выбрать — зависит от ограничений задачи: сколько данных, сколько памяти, как часто выполняется операция. На собеседовании хорошо явно проговорить: «можно за O(n) времени и O(n) памяти или за O(n log n) и O(1)».

Пример

def two_sum(nums, target):
    seen = {}                          # O(n) памяти...
    for i, x in enumerate(nums):
        if target - x in seen:         # ...за проверку O(1) вместо прохода
            return seen[target - x], i
        seen[x] = i
    return None

Что хотят услышать

  • Идея обмена памяти на время и обратно.
  • Конкретные приёмы: хеш-множество, мемоизация, предвычисление, индекс.
  • Умение назвать обе оценки для своего решения.

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

  • Не учитывать дополнительную память, говоря о сложности решения.
  • Считать рекурсию бесплатной по памяти — стек вызовов тоже память.

Что спросят дальше

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем