【发布时间】:2012-02-20 03:28:03
【问题描述】:
所以我需要一种算法来生成不包括循环旋转的数字列表的所有排列(例如 [1,2,3] == [2,3,1] == [3,1,2])。
当序列中至少有 1 个唯一数字时,这相当简单,取出该唯一数字,生成剩余数字的所有排列(但对“标准”排列算法稍作修改)并添加前面的唯一编号。
为了生成排列,我发现有必要将排列代码更改为:
def permutations(done, options)
permuts = []
seen = []
for each o in options
if o not in seen
seen.add(o)
permuts += permutations(done+o, options.remove(o))
return permuts
仅使用选项中的每个唯一数字一次意味着您不会获得 322 两次。
当没有唯一元素时,该算法仍会输出旋转,例如对于 [1,1,2,2],它将输出 [1,1,2,2]、[1,2,2,1] 和 [1,2,1,2],前两个是循环旋转。
那么有没有一种有效的算法可以让我生成所有的排列,而不必经过之后去消除循环旋转?
如果不是,那么消除循环旋转的最有效方法是什么?
注意:这不是使用 Python,而是使用 C++。
【问题讨论】:
-
这不是generating all unique circular permutations of a multiset的复制品吗?那里有一些很好的答案。
标签: c++ algorithm rotation permutation