वहाँ एक रेखीय समय में जगह राइफल फेरबदल एल्गोरिथ्म है? यह एल्गोरिथ्म है कि कुछ विशेष रूप से अलौकिक हाथ प्रदर्शन करने में सक्षम हैं: समान रूप से समान आकार के इनपुट सरणी को विभाजित करना, और फिर दो हिस्सों के तत्वों को इंटरलेय करना।
मैथवर्ल्ड पर एक संक्षिप्त पेज है नाला फेरबदल । विशेष रूप से, मैं आउट-शफ़ल विविधता में दिलचस्पी रखता हूं जो इनपुट सरणी 1 2 3 4 5 6 को 1 4 2 5 3 6 में बदल देता है। ध्यान दें कि उनकी परिभाषा में, इनपुट लंबाई ।
यह रैखिक समय में प्रदर्शन करने के लिए सीधा है अगर हमें आकार या अधिक काम का दूसरा सरणी मिला है । पहले अंतिम तत्वों को सरणी में कॉपी करें । फिर, 0-आधारित अनुक्रमण को मानते हुए, सूचकांकों से के पहले तत्वों को कॉपी करें । इसके बाद ऐरे से दूसरे तत्वों को इनपुट ऐरे में कॉपी करें , सूचकांकों से मैप करें । (हम उससे थोड़ा कम काम कर सकते हैं, क्योंकि इनपुट में पहले और आखिरी तत्व नहीं चलते हैं।)n n [ 0 , 1 , 2 , । । । , N - 1 ] [ 0 , 2 , 4 , । । । , 2 n - 2 ] n [ 0 , 1 , 2 , । । । , N - 1 ] [ 1 , 3 , 5 , । । । ,
इन-प्लेस करने के प्रयास के एक तरीके में क्रमचय के विघटन चक्र में विघटन शामिल है, और फिर प्रत्येक चक्र के अनुसार तत्वों को फिर से व्यवस्थित करना। फिर से, 0-आधारित अनुक्रमण को मानते हुए, 6 तत्व मामले में शामिल क्रमांकन
जैसा कि अपेक्षित था, पहले और अंतिम तत्व निश्चित बिंदु हैं, और यदि हम मध्य 4 तत्वों की अनुमति देते हैं तो हमें अपेक्षित परिणाम मिलते हैं।
दुर्भाग्य से, क्रमपरिवर्तन के गणित के बारे में मेरी समझ (और उनके ) ज्यादातर विकिपीडिया पर आधारित है, और मुझे नहीं पता कि क्या यह रैखिक समय में किया जा सकता है। हो सकता है कि इस फेरबदल में शामिल क्रमोन्नति जल्दी से विघटित हो जाए? इसके अलावा, हमें पूर्ण अपघटन की भी आवश्यकता नहीं है। बस असम्बद्ध चक्रों में से प्रत्येक के एक तत्व को निर्धारित करना पर्याप्त होगा, क्योंकि हम इसके एक तत्व से चक्र को फिर से संगठित कर सकते हैं। शायद एक पूरी तरह से अलग दृष्टिकोण की आवश्यकता है।
संबंधित गणित पर अच्छे संसाधन केवल एक एल्गोरिथ्म के रूप में मूल्यवान हैं। धन्यवाद!