कुछ पृष्ठभूमि के साथ अनोखा क्रमपरिवर्तन। ऐसा करने के लिए, मुझे सर्वोत्तम संभावनाओं को जानने के लिए सभी संभावनाओं को उत्पन्न और मूल्यांकन करने की आवश्यकता है। चूंकि मूल्यांकन में वास्तव में कुछ समय लगता है, इसलिए मैं जितनी कम संभव समाधान उत्पन्न करना पसंद करूंगा जो पूरी तरह से मेरी खोज स्थान को कवर करे। इसके अलावा, मैं जितना अधिक तत्व कर सकता हूं, उतना बेहतर होगा। किसी भी संख्या के लिए के सामान्य रूप से के हैं! क्रमपरिवर्तन, और उन्हें उत्पन्न करना ~ 10 से अधिक संख्याओं के लिए कठिन होगा।कोई मिरर या परिपत्र repetitions
रियल समस्या: खोज अंतरिक्ष दो तत्वों के सभी क्रमपरिवर्तन (एन बार EL1 और एम बार el2, जहां कश्मीर = एम + एन), इन प्रतिबंधों के साथ शामिल करना चाहिए:
- वे अद्वितीय होना है (यानी मैं केवल एक बार [एबीबीबी] चाहता हूं)
- मुझे किसी भी क्रमपरिवर्तन के विपरीत की आवश्यकता नहीं है (यानी यदि मेरे पास [एएबी] है, तो मुझे [baa] की भी आवश्यकता नहीं है)
- मैं परमिट मानता हूं परिपत्र, इसलिए [AAB] = [ए.बी.ए.] = [भेड़]
यदि मैं ऐसा करने में सक्षम हूं, तो संभावनाओं की संख्या में काफी कमी आएगी। चूंकि के आदर्श आदर्श रूप से बड़ा होगा, इसलिए सभी क्रमिक क्रम उत्पन्न करने के लिए संभव नहीं है और फिर इन मानदंडों के अनुसार उन्हें फ़िल्टर करें। मैंने पहले ही प्रतिबंध लगा दिया है (नीचे देखें) और यह मैटलैब के सामान्य क्रमपरिवर्तन फ़ंक्शन (परमिट) के लिए के ^/एन! एम! के लिए 2^के से संख्या को वापस कर देता है, जो एक बड़ी जीत है। दूसरा प्रतिबंध केवल आधे (सर्वोत्तम मामले में) की संभावनाओं को कम करेगा, लेकिन मुझे लगता है कि तीसरा भी संभावनाओं की संख्या में कटौती करने में सक्षम होना चाहिए।
किसी को भी जानता है कि यह कैसे करना है, और अधिमानतः भी गणना करने के लिए कैसे कैसे कई संभावनाएं नहीं होगा, तो है कि मुझे बहुत मदद मिलेगी! मैं एक स्पष्टीकरण पसंद करूंगा, लेकिन कोड भी ठीक है (मैं सी जैसी भाषाओं, जावा (स्क्रिप्ट), पायथन, रूबी, लिस्प/स्कीम पढ़ सकता हूं)।
रुचि के लिए:
function genPossibilities(n, m, e1, e2)
if n == 0
return array of m e2's
else
possibilities = genPossibilities(n-1, m, e1, e2)
for every possibility:
gain = number of new possibilities we'll get for this smaller possibility*
for i in max(0,(m+n-gain))
if possibility(i) is not e1
add possiblity with e1 inserted in position i
return new possibilities
- आप N-1 और एम के लिए सभी क्रमपरिवर्तन है, तो आप कर सकते हैं: यहाँ केवल अद्वितीय क्रमपरिवर्तन मैं अब तक है कि प्राप्त करने के लिए एल्गोरिथ्म है उनको ई 1 डालने से एन और एम के लिए क्रमपरिवर्तन खोजने के लिए उनका उपयोग करें। हालांकि आप बस हर जगह सम्मिलित नहीं कर सकते हैं, क्योंकि तब आपको डुप्लिकेट मिलेंगे। मुझे नहीं पता कि यह क्यों काम करता है, लेकिन आप पुराने संभावनाओं से उत्पन्न होने वाली नई संभावनाओं की संख्या की गणना कर सकते हैं (मैं इसे 'लाभ' कहता हूं)। यह संख्या पहले पुराने क्रमपरिवर्तन के लिए एम + 1 से शुरू होती है और प्रत्येक पुराने क्रमपरिवर्तन के लिए एक से कम हो जाती है जब तक कि यह शून्य न हो जाए, जिस बिंदु पर यह एम पर वापस आ जाता है, आदि (केवल एम> = एन) काम करता है। तो यदि आप एन = 3 और एम = 3 के लिए क्रमपरिवर्तन की गणना करना चाहते हैं और आपके पास एन = 2 और एम = 3 के लिए 10 क्रमपरिवर्तन हैं, तो उनके लाभ [4 3 2 1 3 2 1 2 1 1] होंगे। इस लाभ को क्रमपरिवर्तन की लंबाई से घटाएं और आपको वह अनुक्रमणिका मिलती है जिस पर आप डुप्लिकेट किए बिना नए तत्व डालने शुरू कर सकते हैं।
वह 2 तत्वों के के-टुपल्स चाहता था, के तत्वों के जोड़े नहीं। तो 2^के सही है। – job
आपके उत्तर के लिए धन्यवाद। दरअसल, कदम 1-3 मेरी पहली कोशिश थी, लेकिन वे सभी 2^के संभावनाएं उत्पन्न करेंगे। शेष या तो बहुत कुशल प्रतीत नहीं होता है। मुझे अभी भी सभी 2^के संभावनाओं के लिए कुछ करना है और महत्वपूर्ण कार्य जोड़ा गया है (प्रत्येक व्यक्ति के लिए मुझे दर्पण करने और इसे दो बार स्थानांतरित करने की आवश्यकता है, फिर परिणाम को सॉर्ट करें और इसकी तुलना किसी बड़े लॉग से करें रखना)। – Jordi