Я думаю, что даже хранить ваш результат (который будет упорядоченным списком из N элементов) будет O (N) в памяти, нет?
В любом случае, чтобы ответить на ваш последующий вопрос о выборе перестановкинаугад, вот техника, которая будет лучше, чем просто производить все N!скажем, возможности в списке, а затем случайный выбор индекса.Если мы можем просто выбрать индекс случайным образом и сгенерировать из него соответствующую перестановку, нам будет намного лучше.
Мы можем представить порядок словаря для ваших слов / перестановок и связать с ним уникальное число на основепорядок появления слова / перестановки в словаре.Например, слова из трех символов были бы
perm. index
012 <----> 0
021 <----> 1
102 <----> 2
120 <----> 3
201 <----> 4
210 <----> 5
. Позже вы поймете, почему было проще использовать числа, которые мы использовали, но для других можно было бы выполнить немного больше работы.
Чтобы выбрать случайный случайный случай, вы можете выбрать случайным образом связанный с ним индекс из диапазона 0 ... N! -1 с равномерной вероятностью (простейшая реализация этого явно исключена даже для умеренно большого N, я знаю, ноЯ думаю, что есть достойные обходные пути), а затем определить связанные с ним перестановки.Обратите внимание, что список начинается со всех перестановок последних N-1 элементов, сохраняя первую цифру равной 0. После того, как эти возможности исчерпаны, мы генерируем все те, которые начинаются с 1. После этих следующих (N-1)!Перестановки исчерпаны, мы генерируем те, которые начинаются с 2. И т.д. Таким образом, мы можем определить, что ведущая цифра - это Floor [R / (N-1)!], где R был индексом в смысле, показанном выше.Теперь вы поймете, почему мы тоже проиндексировали ноль?
Чтобы сгенерировать оставшиеся N-1 цифры в перестановке, скажем, что мы определили Floor [R / (N-1)!] = A0.Начните со списка {0, ..., N-1} - {a0} (установить вычитание).Нам нужна Q-я перестановка этого списка, для Q = R mod (N-1) !.За исключением учета того факта, что отсутствует пропущенная цифра, это то же самое, что и проблема, которую мы только что решили.Recurse.