Gibt es einen Algorithmus, um alle eindeutigen zirkulären Permutationen eines Multisets zu generieren?

Ich bin auf dieses Problem gestoßen, als ich enthusiastisch programmiert habe. Das Problem kann wie folgt ausgedrückt werden:

Für ein Multiset A bezeichne P (A) die Menge aller möglichen Permutationen von A. P (A) ist natürlich in disjunkte Teilmengen unterteilt, die Äquivalenzklassen sind, wobei die Äquivalenzbeziehung "durch kreisförmige Verschiebungen in Beziehung gesetzt werden kann". Führen Sie alle diese Äquivalenzklassen auf, indem Sie aus jeder Klasse genau ein Element generieren.

Betrachten Sie beispielsweise das Multiset {0, 1, 1, 2}. Die Permutationen "0112" und "1201" sind eindeutige Permutationen, aber letztere können durch zirkulares Verschieben der ersteren und umgekehrt gefunden werden. Der gewünschte Algorithmus sollte nicht beide erzeugen.

Natürlich ist ein Brute-Force-Ansatz möglich: Erstellen Sie einfach - unabhängig von der zirkulären Duplikation - Permutationen mit einem der Multiset-Permutationsalgorithmen und verwerfen Sie Duplikationen, die im Vergleich zu früheren Ergebnissen gefunden wurden. Dies ist jedoch in der Praxis ineffizient. Der gewünschte Algorithmus sollte nur eine minimale, wenn nicht gar keine Buchhaltung erfordern.

eder Einblick in dieses Problem wird sehr geschätz

Antworten auf die Frage(10)

Ihre Antwort auf die Frage