के बिना तेजी से अद्वितीय संयोजन (डुप्लिकेट के साथ सूची से) मुझे लगता है कि इस तथ्य के बावजूद कि अद्वितीय वस्तुओं की सूची से किसी भी आकार के अद्वितीय संयोजन उत्पन्न करने के लिए ऑनलाइन बहुत सारे एल्गोरिदम और फ़ंक्शंस हैं, इसमें कोई भी उपलब्ध नहीं है गैर-अद्वितीय मदों की एक सूची के मामले (यानी सूची एक ही मूल्य की पुनरावृत्ति से युक्त।)लुकअप
अबसवाल एक गैर-अद्वितीय से सभी अद्वितीय संयोजन एक जनरेटर समारोह में पर-THE-फ्लाई उत्पन्न करने के लिए कैसे है बिना डुप्लीकेट को फ़िल्टर करने की कम्प्यूटेशनल महंगी आवश्यकता?
सवाल यह आसान है मैं क्या हासिल करने की उम्मीद के बारे में अधिक स्पष्टता प्रदान करने के लिए एक इनाम प्रेरित जवाब नहीं है के रूप में:
पहले के कोड कैसे करता है, तो एक संयोजन comboB
माना जाता है की जाँच करने के illustrating प्रदान करते हैं
comboA = [1,2,2]
comboB = [2,1,2]
print("B is a duplicate of A:", comboA.sort()==comboB.sort())
बी के दिए गए उदाहरण में एक का डुप्लिकेट और प्रिंट() है सच प्रिंट: एक और एक (comboA
) का डुप्लिकेट हो।
एक जनरेटर समारोह ऑन-द-मक्खी गैर-अद्वितीय सूची के मामले में अद्वितीय संयोजन प्रदान करने में सक्षम होने का समस्या यहाँ हल किया जाता है: 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
समय से ऊपर दो चरम सीमाओं के उदाहरण देकर स्पष्ट करना: कोई डुप्लिकेट और केवल डुप्लिकेट
यहाँ कुछ समय वर्तमान स्थिति को वर्णन करने। अन्य सभी समय इन दोनों के बीच हैं।
उपर्युक्त परिणामों की मेरी व्याख्या यह है कि एक शुद्ध पायथन फ़ंक्शन (कोई इटरोटोल या अन्य सी-संकलित मॉड्यूल) बहुत तेज हो सकता है, लेकिन यह सूची में कितने डुप्लीकेट हैं, इस पर निर्भर करता है कि यह बहुत धीमा हो सकता है। इसलिए शायद पाइथन के लिए सी ++ कोड लिखने के आसपास कोई रास्ता नहीं है। इसलिए एक्सटेंशन मॉड्यूल आवश्यक कार्यक्षमता प्रदान करता है।
आप कैसे निर्धारित करते हैं कि (1,2,2) और (2,1,2) "सही" हैं? – John
आपकी पहली टिप्पणी वह थी जिसे मैं ढूंढ रहा था। – John
@ क्लाउडियो I ने भी [यह धागा] पाया है (https://mail.python.org/pipermail/python-list/2013-November/660886.html) जिसमें _much_ सरल [पुनरावृत्त एल्गोरिदम] के लिए कोड शामिल है (https://mail.python.org/pipermail/python-list/2013- नवंबर/660886.html) (इनपुट को सॉर्ट करने की आवश्यकता है) और एक [रिकर्सिव एल्गोरिदम] (https://mail.python.org/pipermail/python-list/ 2013-नवंबर/660889.html)। वे वर्तमान उत्तरों की तुलना में काफी अधिक कुशल लगते हैं, लेकिन मैंने वास्तव में उनका परीक्षण नहीं किया है। –