J'ai rencontré ce problème en faisant une programmation enthousiaste. Le problème peut être exprimé comme suit:Existe-t-il un algorithme pour générer toutes les permutations circulaires uniques d'un multiset?
Pour multiset A, soit P (A) représentent le ensemble de toutes les permutations possibles de A. P (A) est naturellement divisé en sous-ensembles disjoints qui sont l'équivalence classes, avec la relation d'équivalence étant "peut être reliée par des déplacements circulaires." Enumérez toutes ces classes d'équivalence en générant exactement un membre de chacune d'elles. Par exemple, considérons le multiset {0, 1, 1, 2}.
Les permutations "0112" et "1201" sont des permutations uniques, mais la dernière peut être trouvée en décalant circulairement la première et vice versa. L'algorithme désiré ne devrait pas générer les deux.
Bien sûr, une approche de force brute est possible: il suffit de générer des permutations - indépendamment de la duplication circulaire - en utilisant l'un des algorithmes de permutation multiset, et de rejeter les doublons trouvés par comparaison avec les résultats précédents. Cependant, ceci tend à être inefficace dans la pratique. L'algorithme souhaité devrait nécessiter une comptabilité minimale, voire nulle.
Toute idée de ce problème est très appréciée.
Merci pour le lien et la référence à l'article de Sawada. Je vais prendre le temps de l'étudier et de le poster si j'ai d'autres questions. –
Eh bien, je vais marquer cela comme la solution :) J'ai également découvert un papier pour un algorithme d'un problème étroitement lié, à savoir la génération de tous les colliers d'une certaine longueur à partir d'un alphabet. Lien vers le document: http://dx.doi.org/10.1006/jagm.2000.1108 –