我有興趣對不同的技術/方法進行比較,這些技術/方法可用於生成給定集合的所有潛在排列。列出一組給定值的所有排列
回答
您可以選擇性能,特定分佈和簡單性。我的意思是,你是否關心一些特定的順序,如詞典的輸出。
據我所知,效果最好的算法是Steinhaus algorithm。從某種意義上說,只有一個處理器指令是必要的才能生成一個排列(不包括打印它所需的指令並不總是需要),這對於乘法常數是最優的。
還有一個非常簡單的算法,它可以按字典順序生成排列,您可能可以自己重新創建一個遞歸過程,其性能爲O(n.log(n).log(n )),因此與通過任何其他方法生成列表並對其進行排序大致相同。
編輯:這裏是一個簡單的算法的僞代碼:
void permute(Element[] permutationPrefix, Set rest)
{
if (rest.IsEmpty) {
// permutationPrefix is now a full permutation
print(permutationPrefix);
} else {
foreach (element in rest) {
permutationPrefix.Append(element);
permute(permutationPrefix, rest.Minus(element))
permutationPrefix.Length--; // cut away the last item
}
}
}
最初與空permutationPrefix
和rest
拿着全套稱之爲;如果這個集合是一個有序的數據結構,排列將按字典順序輸出。
請注意,我們正在複製和修改每個遞歸調用中的集合,這是整個算法中最昂貴的操作,可能與print
方法一起使用。單套副本的成本是對數排列的總數n
;並且因爲遞歸調用棧的深度也是對數的,所以下面是性能估計。
(此算法也適合改裝成一個很乖的隨機置換生成。)
什麼是字典算法?任何其他的比較。 BTW感謝您的評論。 – Bober02 2012-03-26 21:12:22
@ Bober02 - 你走了。 – 2012-03-27 08:29:13
這個問題已經(其實很多次)提出和回答:
Algorithm to generate all possible permutations of a list?
Permutations with a given integer
就我個人而言,我認爲Steinhaus算法正在過度思考問題:它並沒有比最天真的實現更快。最天真的實施
類似Java的僞代碼:
List<List<Element>> generateAllPermutations(List<Element> input)
{
List<Element> output = new ArrayList<Element>();
if (input.size() == 0)
return output;
for (Element first : input) {
for (List<Element> sequence : generateAllPermutations(input - first))
output.add(first + sequence);
}
}
我認爲這是不正確的。你要做的遞歸步驟是這樣的: 給定Set S,生成S- {a}的所有排列,然後向每個排列添加一個。 這是錯誤的,因爲您應該將該元素輸入每個排列的每個元素的EVER位置 – Bober02 2012-03-28 21:24:27
@ Bober02:我不會跟着你。「我應該把這個元素輸入每個排列的每個地方?」例如:{1,1,1,1,1} ...?這不是一個排列組合。 – 2012-03-30 00:30:44
- 1. 列出兩個給定值之間的所有值
- 2. 做一個排列函數,輸出所有可能的數組排列?
- 3. 的字典組合所有可能的排列出2所列出
- 4. 返回列表<int[]>包含給定數組的所有排列
- 5. SQLalchemy:用於列值組合的所有排列的分位數
- 6. 列出所有排列組合和在整數的ArrayList遞歸
- 7. 如何列出給定的SQL查詢的所有列
- 8. 獲取給定的一組散列鍵的所有項目
- 9. 蟒蛇 - 所有一陣列的給定長度的組合
- 10. haskell從列表的列表中刪除所有出現的給定值
- 11. ORACLE SQL:查找按年排序的給定值的所有列值
- 12. 列出包含給定列名的所有表
- 13. 所有排列
- 14. 給定一組n個整數,列出所有可能的子集sum> = k
- 15. 列出所有Active Directory組
- 16. 所有大寫字母排列並交替排列的數組
- 17. 給定列中的所有行必須匹配,所有列
- 18. 獲取PHP數組的所有排列?
- 19. GroupBy所有可能的排列組合
- 20. 如何輸出分組對象中指定列中的所有值的列表
- 21. 生成給定數字的數字的所有排列?
- 22. 用條件查找給定N的所有排列的算法
- 23. 如何獲取特定列的值的所有唯一組合
- 24. 給出一個元組列表,返回元組第一個值的新列表
- 25. 獲取所有值的排列 - 成對
- 26. C#找一個數組中最接近的所有值給出給定數量
- 27. 確定性給出排序列表
- 28. 數組列表:排列如何打印10所列出
- 29. Python中的一組列表的所有可能的排列組合
- 30. 在給定的列表元素的給定長度中查找所有具有重複的排列
的可能重複[算法生成一個列表的所有可能的排列?(http://stackoverflow.com/questions/2710713/算法生成所有可能的列表) – Tacet 2014-10-30 21:47:33