我認爲,儘管網上有大量的算法和函數用於從唯一項目列表中生成任意大小的唯一組合,但是沒有可用的的非唯一項的列表的情況下(即,包含相同的值的重複列表。)FAST獨特的組合(從重複列表中)
的問題是如何產生ON-THE-FLY在發電機功能所有 從非唯一的唯一組合列表沒有 計算昂貴的需要篩選出重複?
現在是有賞金激勵問題的答案更容易提供什麼,我希望實現更清晰:
首先,讓我們提供的代碼說明如何檢查相結合comboB
被認爲是另一個(comboA
)的副本:
comboA = [1,2,2]
comboB = [2,1,2]
print("B is a duplicate of A:", comboA.sort()==comboB.sort())
在B的給定的例子是A的副本和打印()打印真。
獲取發生器功能時能夠在非唯一列表的情況下即時提供唯一組合的問題在此解決:Getting unique combinations from a non-unique list of items, FASTER?,但提供的發生器功能需要查找並需要存儲器大量的組合。
中回答中提供的功能的最新版本做這項工作沒有任何查詢,似乎這裏是正確的答案,但...
背後擺脫查找的目標是加快代在重複列表的情況下的唯一組合。
我最初(寫這個問題的第一個版本)錯誤地認爲,不需要創建用於查找所需的集合以確保唯一性的代碼,預計會比需要查找的代碼帶來優勢。 情況並非如此。至少不總是。到目前爲止提供的答案中的代碼不使用查找,但是在沒有冗餘列表的情況下或者只有少數多餘的項目在列表中時,需要花費更多的時間來生成所有組合。
這裏是一些定時來說明目前的狀況:
-----------------
k: 6 len(ls): 48
Combos Used Code Time
---------------------------------------------------------
12271512 len(list(combinations(ls,k))) : 2.036 seconds
12271512 len(list(subbags(ls,k))) : 50.540 seconds
12271512 len(list(uniqueCombinations(ls,k))) : 8.174 seconds
12271512 len(set(combinations(sorted(ls),k))): 7.233 seconds
---------------------------------------------------------
12271512 len(list(combinations(ls,k))) : 2.030 seconds
1 len(list(subbags(ls,k))) : 0.001 seconds
1 len(list(uniqueCombinations(ls,k))) : 3.619 seconds
1 len(set(combinations(sorted(ls),k))): 2.592 seconds
以上的時序說明了兩個極端:無重複,只重複。所有其他時間都在這兩者之間。
我對上述結果的解釋是,純Python函數(沒有itertools或其他C編譯模塊)可以非常快,但它也可能慢得多,具體取決於列表中有多少重複項。因此,可能沒有辦法爲編寫Python .so擴展模塊的C++代碼提供所需的功能。
你如何確定(1,2,2)和(2,1,2)哪一個是「正確的」? – John
您的第一條評論是我正在尋找的。 – John
@Claudio我還發現[此線程](https://mail.python.org/pipermail/python-list/2013-November/660886.html),其中包含_much_ simpler [迭代算法]的代碼(https:/ /mail.python.org/pipermail/python-list/2013-November/660886.html)(需要排序輸入)以及[遞歸算法](https://mail.python.org/pipermail/python-list/ 2013 - 11月/ 660889.html)。他們似乎比當前的答案更高效,但我沒有真正測試過它們。 –