क्या कोई क्रमिक एल्गोरिदम (बड़े ओ नोटेशन के मामले में कुशल है) एक क्रमपरिवर्तन पी को पहचान क्रमपरिवर्तन में परिवर्तित करने के लिए स्वैप की संख्या खोजने के लिए? स्वैप को आसन्न तत्वों पर, लेकिन किसी भी तत्व पर होने की आवश्यकता नहीं है।क्रमपरिवर्तन में स्वैप की संख्या
उदाहरण के लिएतो:
I = {0, 1, 2, 3, 4, 5}, number of swaps is 0
P = {0, 1, 5, 3, 4, 2}, number of swaps is 1 (2 and 5)
P = {4, 1, 3, 5, 0, 2}, number of swaps is 3 (2 with 5, 3 with 5, 4 with 0)
एक विचार इस तरह एक एल्गोरिथ्म लिखना है:
int count = 0;
for(int i = 0; i < n; ++ i) {
for(; P[i] != i; ++ count) { // could be permuted multiple times
std::swap(P[P[i]], P[i]);
// look where the number at hand should be
}
}
लेकिन यह बहुत स्पष्ट है मेरे लिए है कि क्या है कि वास्तव में समाप्त करने के लिए गारंटी है या नहीं है कि क्या यह स्वैप की सही संख्या पाता है। यह उपरोक्त उदाहरणों पर काम करता है। मैंने 5 और 12 नंबरों पर सभी क्रमपरिवर्तन उत्पन्न करने की कोशिश की और यह हमेशा उन पर समाप्त हो जाता है।
यह समस्या संख्यात्मक रैखिक बीजगणित में उत्पन्न होती है। कुछ मैट्रिक्स अपघटन पिवोटिंग का उपयोग करते हैं, जो छोटी संख्याओं से विभाजन से बचने और संख्यात्मक स्थिरता में सुधार के लिए प्रभावी रूप से अगली पंक्ति के लिए अधिकतम मूल्य के साथ पंक्ति को स्वैप कर देता है। कुछ अपघटन, जैसे कि LU decomposition को बाद में मैट्रिक्स निर्धारक की गणना करने के लिए उपयोग किया जा सकता है, लेकिन विघटन की निर्धारक का संकेत मूल मैट्रिक्स के विपरीत है, यदि क्रमपरिवर्तन की संख्या विषम है।
EDIT: मैं मानता हूं कि यह प्रश्न Counting the adjacent swaps required to convert one permutation into another जैसा है। लेकिन मैं तर्क दूंगा कि यह सवाल अधिक मौलिक है। ओ (एन) में क्रम क्रमपरिवर्तन को परिवर्तित करके, ओ (एन) में क्रमपरिवर्तन लिखकर और फिर वहां से स्वैप की संख्या को पहचानने के लिए एक दूसरे से क्रमपरिवर्तन परिवर्तित करना इस समस्या में परिवर्तित किया जा सकता है। स्पष्ट रूप से पहचान का प्रतिनिधित्व करके इस प्रश्न को हल करना क्योंकि एक और क्रमपरिवर्तन उप-स्थानिक लगता है। इसके अलावा, दूसरा प्रश्न था, कल तक, चार उत्तरों जहां केवल एक ही (द्वारा | \/| विज्ञापन) प्रतीत होता था, लेकिन विधि का विवरण अस्पष्ट लग रहा था। अब उपयोगकर्ता लिज़ुसेक ने मेरे प्रश्न का उत्तर दिया। मैं इस सवाल को डुप्लिकेट के रूप में बंद करने से सहमत नहीं हूं।
EDIT2: प्रस्तावित एल्गोरिथ्म वास्तव में नहीं बल्कि सर्वोत्तम होने की, के रूप में उपयोगकर्ता rcgldr द्वारा एक टिप्पणी में कहा, Counting the adjacent swaps required to convert one permutation into another करने के लिए अपने जवाब देखने लगता है।
@CPlusPlusOOAandD मुझे लगता है कि किसी भी किताब नहीं है। यह मुश्किल से प्रासंगिक है, क्योंकि अपघटन आसानी से वापस कर सकता है कि कितने क्रमिकताएं हुईं और कोई गिनती की आवश्यकता नहीं है। मुझे सैद्धांतिक दृष्टिकोण से इस तरह के एल्गोरिदम में दिलचस्पी थी। यदि आप संख्यात्मक तरीकों के बारे में सीखने में रुचि रखते हैं, तो मेरा सुझाव है कि आप स्वयं को न्यूमेरिकल व्यंजनों (http://www.nr.com/) का अंतिम संस्करण प्राप्त करें। –
आप गुणा के कारकों के चक्रों की लंबाई की गणना कर सकते हैं जो बताएंगे कि इसे पहचान में बदलने के लिए कितने स्वैप की आवश्यकता है – 4pie0
ध्यान दें कि प्रत्येक स्वैप अपने उचित स्थान में कम से कम एक तत्व रखता है, इसलिए एन संख्याओं के लिए दक्षता ओ (एन) है । मुझे यकीन नहीं है कि उससे अधिक कुशल कैसे प्राप्त करें। – rcgldr