को छोड़कर सभी क्रमपरिवर्तन जनरेट कर रहा है तो मैं एक एल्गोरिथ्म की जरूरत है चक्रीय रोटेशन को छोड़कर नंबर की एक सूची के सभी क्रमपरिवर्तन (उत्पन्न करने के लिए जैसे [1,2,3] == [2,3,1] == [3,1,2])।
अनुक्रम में कम से कम 1 अद्वितीय संख्या होने पर यह काफी सीधे आगे है, उस अद्वितीय संख्या को निकालें, शेष संख्याओं के सभी क्रमपरिवर्तन उत्पन्न करें (लेकिन 'मानक' क्रमपरिवर्तन एल्गोरिदम में एक छोटे से संशोधन के साथ) और जोड़ें सामने के लिए अद्वितीय संख्या।
क्रमपरिवर्तन मैंने पाया है कि यह करने के लिए क्रमपरिवर्तन कोड बदलने के लिए आवश्यक है पैदा करने के लिए:
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] होगा और पहले दो चक्रीय घूर्णन होंगे।
तो वहाँ एक कुशल एल्गोरिथ्म है कि मुझे चक्रीय आवर्तन दूर करने के लिए बाद में के माध्यम से जाने के बिना सभी क्रमपरिवर्तन उत्पन्न करने के लिए अनुमति होगी है?
यदि नहीं, तो क्या चक्रीय रोटेशन को दूर करने के लिए सबसे कारगर तरीका हो सकता है?
नोट: इस नहीं अजगर उपयोग कर रहा है, बल्कि सी ++।
([एक मल्टीसेट के सभी अद्वितीय परिपत्र क्रमपरिवर्तन पैदा] के इस डुप्लिकेट http://stackoverflow.com/questions/3467914/is-there-an-algorithm-to-generate-all-unique-circular नहीं है) के- एक-मल्टीसेट -permutations?वहाँ कुछ अच्छे जवाब हैं। – Kalin