Памятка для генерации перестановки - PullRequest
0 голосов
/ 19 декабря 2011

Есть ли способ запоминания техники генерации перестановки. Например для номеров 1234 ...

Для меня проблема в том, что это занимает много памяти. Есть ли способ в какой-то умеренный объем памяти

Ответы [ 3 ]

0 голосов
/ 19 декабря 2011

Да, конечно, можно использовать памятку для генерации перестановки (как почти любое другое вычисление, когда это имеет смысл). Конкретные шаги зависят от вашего алгоритма генерации перестановок. Например, если у вас есть функция 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() все еще будут вычисляться дважды или более раз.

0 голосов
/ 19 декабря 2011

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

0 голосов
/ 19 декабря 2011

Для любой строки, скажем, с n различными символами, n! Существуют перестановки, поэтому необходимое пространство будет большим. Если вам просто нужно перечислить перестановки, то я бы посоветовал не хранить их, а непосредственно отображать каждый из них при вычислении каждого

...