Что такое компромисс между временем и памятью?
- Как ускорить алгоритм за счёт памяти?
- Что такое мемоизация и кэширование с точки зрения сложности?
Часто можно ускорить алгоритм, потратив больше памяти — сохранить промежуточные результаты, индекс или предвычисленную таблицу — и наоборот.
- Примеры: хеш-множество вместо вложенного цикла, мемоизация, индекс в базе, кэш
- Сложность по памяти оценивают так же, через O, включая дополнительную память алгоритма
А ещё Выбор зависит от ограничений: памяти мало (встраиваемые системы) или время критично
Подробно
У алгоритма две основные характеристики: время и дополнительная память. Их часто можно обменивать друг на друга.
Память в обмен на время:
- хеш-множество — проверка «видели ли мы элемент» за 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Что хотят услышать
- Идея обмена памяти на время и обратно.
- Конкретные приёмы: хеш-множество, мемоизация, предвычисление, индекс.
- Умение назвать обе оценки для своего решения.
Частые ошибки
- Не учитывать дополнительную память, говоря о сложности решения.
- Считать рекурсию бесплатной по памяти — стек вызовов тоже память.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Ускорить алгоритм можно, потратив память: хеш-множество, мемоизация, индекс, кэш — и наоборот
- ✗Память на скорость алгоритма не влияет
- ✗Сложность по памяти не оценивают через O
- ✗Кэш всегда уменьшает и время, и память, поэтому компромисса нет: правильно спроектированный алгоритм выигрывает по обоим параметрам сразу
Что спросят дальше
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.