我在进行一些热情的编程时遇到了这个问题。该问题可以表述如下:
对于一个多重集 A,令 P(A) 表示 A 的所有可能排列的集合。P(A) 自然被划分为互不相交的子集,这些子集是等价类,并且等价关系为“可以通过循环移位相互相关联”。通过生成每个等价类中的一个成员来列举所有这些等价类。
例如,考虑多重集 {0, 1, 1, 2}。排列“0112”和“1201”是唯一的排列,但后者可以通过循环移动前者得到,反之亦然。所需的算法不应该同时生成两个排列。
当然,一种暴力的方法是可能的:使用任何多重集排列算法生成排列,无视循环重复,并通过与先前结果进行比较来丢弃重复项。然而,在实践中,这种方法往往效率低下。所需的算法应该需要最少的,如果有的话,则需要零的簿记。
非常感谢您对这个问题的任何见解。