2012-06-18 19 views
6

में कुशल व्यवस्था एल्गोरिदम मैं एक ऐसी विधि लिखने की कोशिश कर रहा हूं जो एक बिजली सेट के सभी क्रमपरिवर्तनों की गणना करेगा जहां आदेश महत्वपूर्ण है। मेरा मानना ​​है कि इन्हें "व्यवस्था" कहा जाता है। क्या मैं यह मतलब है:जावा

{a} -> {{a}, {}} 
{a,b} -> {{a,b}, {b,a}, {a}, {b}, {}} 
{a,b,c} -> {{a,b,c}, {a,c,b}, {b,a,c}, {b,c,a}, {c,a,b}, {c,b,a}, {a,b}, {a,c}, {b,a}, {b,c}, {c,a}, {c,b}, {a}, {b}, {c}, {}} 

आदि मेरे धारणा है कि, सेट S दिया, मैं एस के Powerset के हर सबसेट के हर क्रमचय उत्पन्न करनी चाहिए तो सबसे पहले Powerset उत्पन्न है, तो एक क्रमचय नक्शा है प्रत्येक सेट पर काम करें।

समस्या यह है कि यह बेहद जटिल है - ओ (Σn!/K!) जैसे कुछ = k..nn के साथ।

मुझे आश्चर्य है कि क्या कोई मौजूदा एल्गोरिदम है जो इस तरह की चीज को बहुत कुशलतापूर्वक (शायद समानांतर कार्यान्वयन) करता है। या शायद एक समांतर पावरसेट एल्गोरिदम मौजूद है और समानांतर क्रमपरिवर्तन एल्गोरिदम मौजूद है, मैं दोनों को जोड़ सकता हूं।

विचार?

+2

शायद इस पोस्ट को चेक करें: http://stackoverflow.com/questions/1506078 – squiguy

+0

[फास्ट क्रमपरिवर्तन -> संख्या -> क्रमपरिवर्तन मैपिंग एल्गोरिदम] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1506078/fast -परमिशन-संख्या-क्रमपरिवर्तन-मानचित्रण-एल्गोरिदम) – Makoto

+1

मुझे नहीं लगता कि यह एक डुप्लिकेट है। मैंने उस थ्रेड को पढ़ा और यह कुछ अलग से पूछता है। समाधान विषय में कुछ हद तक समान हैं लेकिन अलग-अलग धागे वारंट करने के लिए निश्चित रूप से काफी अलग हैं। – rhombidodecahedron

उत्तर

1

Google द्वारा प्रदान की गई गुवा लाइब्रेरी में संग्रहों की अनुमति देने के लिए विभिन्न विधियां हैं।

कक्षा comavmonmon.collect.vollections2 here के javadoc देखें।

+0

अच्छा जवाब, वास्तव में छोटे संग्रहों के लिए आसान है, लेकिन मुझे नहीं लगता कि एन बढ़ने पर कार्यान्वयन के पैमाने। –

0

ऐसा करने के लिए आप पहले 1-एन स्लॉट के लिए संयोजन उत्पन्न करते हैं जहां एन पावर सेट में तत्वों की संख्या है। उदाहरण के लिए, अगर आप 3 तत्व है, तो आप करना होगा:

सी (3, 3) 1 संयोजन (एबीसी)
सी (3, 2) = 3 संयोजन (ab) (एसी) (बीसी) =
सी (3, 1) = 3 संयोजन (ए) (बी) (सी)

अब, आप प्रत्येक संयोजन के लिए क्रमपरिवर्तन उत्पन्न करते हैं।

परमिट और संयोजन की गणना करने के लिए प्रसिद्ध एल्गोरिदम हैं। उदाहरण के लिए, Knuth की "द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग", वॉल्यूम 4 ए, सेक्शन 7.2.1.2 और 7.2.1.3, समझाएं कि प्रासंगिक एल्गोरिदम कैसे बनाएं।