Я столкнулся с этой проблемой, когда занимался энтузиазмом. Проблема может быть выражена следующим образом:
Для мультимножества A пусть P (A) обозначает множество всех возможных перестановок А. P (A) естественно разделяется на непересекающиеся подмножества, эквивалентные классов с отношением эквивалентности будучи "могут быть связаны круговыми сдвигами". Перечислить все эти классы эквивалентности путем генерации ровно один член от каждого из них.
Например, рассмотрим мультимножество {0, 1, 1, 2}. Перестановки "0112" и "1201" являются уникальными перестановками, но последние можно найти путем кругового сдвига первого и наоборот. Желаемый алгоритм не должен генерировать оба.
Конечно, возможен подход с грубой силой: просто сгенерируйте перестановки - независимо от циклического дублирования - используя любой из алгоритмов многопозиционной перестановки и отбросьте дубликаты, найденные по сравнению с предыдущими результатами. Однако на практике это на практике неэффективно. Требуемый алгоритм должен требовать минимальной, если не нулевой бухгалтерии.
Любое понимание этой проблемы глубоко оценено.