रैखिक समय में जगह राइफल फेरबदल एल्गोरिथ्म


15

वहाँ एक रेखीय समय में जगह राइफल फेरबदल एल्गोरिथ्म है? यह एल्गोरिथ्म है कि कुछ विशेष रूप से अलौकिक हाथ प्रदर्शन करने में सक्षम हैं: समान रूप से समान आकार के इनपुट सरणी को विभाजित करना, और फिर दो हिस्सों के तत्वों को इंटरलेय करना।

मैथवर्ल्ड पर एक संक्षिप्त पेज है नाला फेरबदल । विशेष रूप से, मैं आउट-शफ़ल विविधता में दिलचस्पी रखता हूं जो इनपुट सरणी 1 2 3 4 5 6 को 1 4 2 5 3 6 में बदल देता है। ध्यान दें कि उनकी परिभाषा में, इनपुट लंबाई ।2n

यह रैखिक समय में प्रदर्शन करने के लिए सीधा है अगर हमें आकार या अधिक काम का दूसरा सरणी मिला है । पहले अंतिम तत्वों को सरणी में कॉपी करें । फिर, 0-आधारित अनुक्रमण को मानते हुए, सूचकांकों से के पहले तत्वों को कॉपी करें । इसके बाद ऐरे से दूसरे तत्वों को इनपुट ऐरे में कॉपी करें , सूचकांकों से मैप करें । (हम उससे थोड़ा कम काम कर सकते हैं, क्योंकि इनपुट में पहले और आखिरी तत्व नहीं चलते हैं।)n n [ 0 , 1 , 2 , , N - 1 ] [ 0 , 2 , 4 , , 2 n - 2 ] n [ 0 , 1 , 2 , , N - 1 ] [ 1 , 3 , 5 , ,nnn[0,1,2,...,n1][0,2,4,...,2n2]n[0,1,2,...,n1][1,3,5,...,2n1]

इन-प्लेस करने के प्रयास के एक तरीके में क्रमचय के विघटन चक्र में विघटन शामिल है, और फिर प्रत्येक चक्र के अनुसार तत्वों को फिर से व्यवस्थित करना। फिर से, 0-आधारित अनुक्रमण को मानते हुए, 6 तत्व मामले में शामिल क्रमांकन

σ=(012345024135)=(0)(5)(1243).

जैसा कि अपेक्षित था, पहले और अंतिम तत्व निश्चित बिंदु हैं, और यदि हम मध्य 4 तत्वों की अनुमति देते हैं तो हमें अपेक्षित परिणाम मिलते हैं।

दुर्भाग्य से, क्रमपरिवर्तन के गणित के बारे में मेरी समझ (और उनके ) ज्यादातर विकिपीडिया पर आधारित है, और मुझे नहीं पता कि क्या यह रैखिक समय में किया जा सकता है। हो सकता है कि इस फेरबदल में शामिल क्रमोन्नति जल्दी से विघटित हो जाए? इसके अलावा, हमें पूर्ण अपघटन की भी आवश्यकता नहीं है। बस असम्बद्ध चक्रों में से प्रत्येक के एक तत्व को निर्धारित करना पर्याप्त होगा, क्योंकि हम इसके एक तत्व से चक्र को फिर से संगठित कर सकते हैं। शायद एक पूरी तरह से अलग दृष्टिकोण की आवश्यकता है।LATEX

संबंधित गणित पर अच्छे संसाधन केवल एक एल्गोरिथ्म के रूप में मूल्यवान हैं। धन्यवाद!


एक टाइम सोल्यूशन है ( अतिरिक्त जगह के साथ)। मैं किसी भी रैखिक समय समाधान नहीं जानता। O ( 1 )O(nlgn)O(1)
राडु GRIGore

4
यह cs.stackexchange के लिए अधिक उपयुक्त है। गैर-समान मॉडल में, बार हमेशा संभव होता है। इस मामले में यह समान रूप से भी संभव होना चाहिए। O(n)
युवल फिल्मस

1
@Radu इस प्रश्न के समान , इस समस्या का केवल अतिरिक्त स्थान का उपयोग करके समाधान नहीं है , लेकिन अतिरिक्त स्थान है। O ( लॉग एन )O(1)O(logn)
टायसन विलियम्स

2
मैं अपनी टिप्पणी (और मतदान बंद करने के लिए) वापस लेता हूं! (हालांकि सवाल का जवाब साहित्य में दिया गया है।)
युवल फिल्मस

1
मैंने पिछले हफ्ते एक सीएस छात्र से यह सवाल सुना था, जिसने इसे नौकरी के लिए साक्षात्कार में सुना था।
जेफ

जवाबों:


12

समस्या आश्चर्यजनक रूप से गैर-तुच्छ है। यहां पर एलिस और मार्कोव, इन-सीटू, स्टेबल मर्जिंग द परफेक्ट शफल (धारा 7) का अच्छा समाधान है । एलिस, क्रैन और फैन, परफेक्ट साइफल परम्यूटेशन में चक्रों की गणना करने पर अधिक मेमोरी की कीमत पर "साइकिल लीडर्स" का चयन करने में सफल होते हैं। संबंधित भी फिच , मुनरो और पॉबल द्वारा अच्छा पेपर है, पर्म्यूटिंग इन प्लेस , जो ओरेकल मॉडल के लिए एक सामान्य टाइम एल्गोरिदम देता है। यदि केवल क्रमपरिवर्तन के लिए एक ओरेकल उपलब्ध है, तो एल्गोरिथ्म को लॉगरिदमिक स्थान की आवश्यकता होती है; यदि हमारे पास व्युत्क्रम के लिए एक ओरेकल भी है, तो उसे निरंतर स्थान की आवश्यकता होती है।O(nlogn)

अब एलिस और मार्कोव के समाधान के लिए। पहले, मान लीजिए कि । फिर क्रम n के सही फेरबदल की गणना करता है, क्रम x और y के सही फेरबदल की गणना करता है , एक रोटेशन से पहले। यहाँ उदाहरण के लिए एक प्रमाण है ( n = 5 , x = 3 , y = 2 ): 012 345 67 89 012 567 34 89 051627 3849n=x+ynxyn=5x=3y=2

012345678901256734890516273849

एलिस और मार्कोव ने निरंतर अंतरिक्ष और रैखिक समय का उपयोग करते हुए, सही फेरबदल की गणना करने का एक आसान तरीका पाया । इसका उपयोग करते हुए, हम मनमानी एन के लिए एकदम सही फेरबदल के लिए एक एल्गोरिथ्म प्राप्त करते हैं । सबसे पहले, लिखने n = 2 कश्मीर 0 + + 2 कश्मीर डब्ल्यू की बाइनरी एन्कोडिंग का उपयोग n , और n मैं = 2 कश्मीर मैं + + 2 कश्मीर डब्ल्यू । मध्य n 0 बिट्स को घुमाएं , दाएं हाथ को 2 k फेरबदल करेंn=2knn=2k0++2kwnni=2ki++2kwn0 बिट्स। दाहिनी ओर2 k 0 बिट्स कोअनदेखा करना, मध्यn1बिट्स कोघुमाएं, और दाएं हाथ को2 k 1 बिट्स मेंफेरबदल करें। और इसी तरह। ध्यान दें कि चक्र के नेताओं के रूप में पहले कुछ तत्वों को घुमाए जाने के बाद से रोटेशन आसान है। रोटेशन की कुल जटिलता हैहे(एन0++एनडब्ल्यू)=हे(एन), के बाद सेएन टी + 1 <nटी/2। आंतरिक फेरबदल की कुल जटिलताहे(2k02k0n12k1O(n0++nw)=O(n)nt+1<nt/2O(2k0++2kw)=O(n)

यह दिखाने के लिए रहता है कि कैसे सही फेरबदल की गणना करें जब । वास्तव में, हम, चक्र नेताओं की पहचान करने में सक्षम हो जाएगा हार (फ्रेडरिकसेन और Maiorana, पर शास्त्रीय काम के बाद में मोती की हार कश्मीर रंग और k de Bruijn दृश्यों -ary ; फ्रेडरिकसेन और केसलर, दो रंगों में मोतियों की हार पैदा करने के लिए एक एल्गोरिद्म )।n=2kkk

कनेक्शन क्या है? मेरा दावा है कि फेरबदल की अनुमति बाइनरी प्रतिनिधित्व के सही स्थानांतरण से मेल खाती है। यहां उदाहरण के द्वारा एक सबूत, के लिए है : 000 001 010 011 100 101 110 111 000 100 001 101 010 110 011 111 इसलिए, चक्र नेताओं को खोजने के लिए, हम के रोटेशन की प्रत्येक तुल्यता वर्ग के एक प्रतिनिधि पता लगाने के लिए की जरूरत है लंबाई के बाइनरी स्ट्रिंग्स k । ऊपर वर्णित कागजात सभी चक्र नेताओं को उत्पन्न करने के लिए निम्नलिखित एल्गोरिदम देते हैं । 0 k से शुरू करेंn=8

000001010011100101110111000100001101010110011111
k0k। हर कदम पर, हम कुछ बिंदु पर कर रहे हैं । अधिक से अधिक सूचकांक का पता लगाएं मैं एक शून्य सा, विभाजन की कश्मीर से मैं प्राप्त करने के लिए कश्मीर = मैं + आर , और निम्न बिंदु रहने दो ( एक 1 ... एक मैं - 1 1 ) d एक 1 ... एक आर । जब भी आर = 0 , नया स्ट्रिंग एक साइकिल नेता है।a1akikik=di+r(a1ai11)da1arr=0

उदाहरण के लिए, जब यह अनुक्रम 0000 , 0001 , 0010 , 0011 , 0101 , 0110 , 0111 , 1111 उत्पन्न करता है n=16

0000,0001,0010,0011,0101,0110,0111,1111.

साइकिल नेताओं पर प्रकाश डाला गया है।


3
आर्यभट्ट का उत्तर भी देखें, जो arxiv.org/abs/0805.1598 का उपयोग करता है । जैन द्वारा "पेपर, ए सिंपल इन-प्लेस एल्गोरिथम फॉर इन-शफल", एक ही विचार का उपयोग करता है, लेकिन की शक्तियों के बजाय , 3 की शक्तियों का उपयोग करता है । मुद्दा यह है कि चूंकि 2 एक आदिम रूट मोडुलो 3 k है , इसलिए यह आसानी से देखा जाता है कि 3 0 , , 3 k साइकिल लीडर हैं। एलिस और मार्कोव से भी सरल! 2323k30,,3k
युवल फिल्मस

हालांकि मुझे लगता है कि जैन का पेपर थोड़ा और सीधा है, मैं पहले वाले पेपर को पसंद कर रहा हूं, साथ ही सबसे ज्यादा वोटों वाले पोस्ट को भी।
जॉनी

6

यह cs.stackexchange.com पर एक बोइंग प्रश्न था और एक उत्तर यहाँ है: /cs/332/in-place-al एल्गोरिदम-for-interleaving-an-array-400#400

यह कागज का स्पष्टीकरण है: http://arxiv.org/abs/0805.1598

k2k32k=2

j2jmod2n+1


हा! मैं उस प्रश्न के बारे में पूरी तरह से भूल गया, भले ही मैंने चर्चा में भाग लिया हो। इसका मतलब है कि मैं वास्तव में यह नहीं समझ पाया कि यह उस समय कैसे काम करता है।
रादु GRIGore

2

mn=m2if(i)=2iin/2f(i)=2(imodn/2)1i>n/2

O(1)O(logn)


आह, रुको। यह मानता है कि राइफल क्रमचय के सभी मान एक ही चक्र पर हैं। इस रणनीति को थोड़ा संशोधित करना होगा, जो इस बात पर निर्भर करता है कि कितने असंतुष्ट चक्र हैं।
रॉबर्ट रॉबरे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.