所有排列所以我需要一個算法來產生不包括循環轉動號碼列表的所有排列(例如,[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