Всегда есть компромисс. Это либо скорость, либо память. Перестановки могут быть преобразованы в индексы, как описано здесь , но это дорого. С другой стороны, вам не нужно конвертировать их. Из того, что вы написали, я понимаю, что ваш алгоритм работает на перестановках, поэтому он «знает» их. В этом случае он может просто хранить их (посещенные) как есть (скажем, в списке или хэш-наборе). В этом случае вы не тратите дополнительное время на «сжатие» перестановки в индекс, но вам нужно убедиться, что у вас достаточно памяти.
Еще одно умственное упражнение, которое стоит выполнить, - определение количества различных перестановок, для которых ваш алгоритм должен хранить «посещенное» состояние. Таким образом, вы можете более реалистично решить, нужно ли вам экономить память, или вы можете выбрать более быстрый вариант.
Также несколько раз назад я гуглил "c # permutations" и смог найти ряд комбинаторных библиотек, независимо от того, предоставляют ли они то, что вы хотите, или нет, я не знаю, я предлагаю вам взглянуть на них и посмотреть, могут ли они тебе подходит.