Да, конечно, можно использовать памятку для генерации перестановки (как почти любое другое вычисление, когда это имеет смысл). Конкретные шаги зависят от вашего алгоритма генерации перестановок. Например, если у вас есть функция perms(numbers)
, которая принимает набор чисел (скажем, {1, 2, 3, 4}
) и возвращает набор всех перестановок (упорядоченные векторы этих чисел, скажем, {[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], ...}
) путем рекурсивного вызова perms()
с подмножествами numbers
, вы можете запомнить эту функцию perms()
напрямую. Для этого создайте кеш в виде карты, где ключи - это наборы чисел, а значения - результаты вызова функции.
По поводу второй части вашего вопроса (о памяти). Мемоизация по своей природе использует большой объем памяти. Вы всегда можете исправить это количество, используя какой-то кэш фиксированного размера (например, LRU / LFU map), но вы должны понимать, что это нарушает концепцию запоминания, и некоторые вызовы perms()
все еще будут вычисляться дважды или более раз.