所有排列所以我需要一个算法来产生不包括循环转动号码列表的所有排列(例如,[1,2,3] == [2,3,1] == [3,1,2])。
当序列中至少有一个唯一编号时,它非常直接,取出该唯一编号,生成其余编号的所有排列(但对“标准”排列算法进行小修改)并添加前面的唯一号码。
为了生成我发现,这是必要的置换代码更改为排列:
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++。
这不是一个[生成多重集的所有独特循环排列]的副本(http://stackoverflow.com/questions/3467914/is-there-an-algorithm-to-generate-all-unique-circular -permutations-的-A-多重集)?那里有一些很好的答案。 – Kalin 2014-05-23 02:42:14