दो कतारों का उपयोग करके किसी सूची को उलटना


12

यह प्रश्न एक मौजूदा प्रश्न से प्रेरित है कि क्या स्टैक ऑपरेशन के दौरान परिचालित समय में दो कतारों का उपयोग करके एक स्टैक को सिम्युलेटेड किया जा सकता है । उत्तर अज्ञात प्रतीत होता है। यहां एक और अधिक विशिष्ट प्रश्न है, जो उस विशेष मामले से संबंधित है जिसमें सभी PUSH ऑपरेशन पहले किए जाते हैं, उसके बाद सभी POP ऑपरेशन होते हैं। दो प्रारंभिक खाली कतारों का उपयोग करके तत्वों की सूची को कितनी कुशलता से उलटा किया जा सकता है? कानूनी कार्रवाई कर रहे हैं:O(1)N

  1. इनपुट सूची (या तो कतार की पूंछ) से अगले तत्व को संलग्न करें।
  2. तत्व को या तो कतार के शीर्ष पर रखें और इसे फिर से संलग्न करें (या तो कतार की पूंछ पर)।
  3. तत्व को या तो कतार के सिर पर रखें और आउटपुट सूची में जोड़ें।

यदि इनपुट सूची में तत्व , तो उलटी आउटपुट सूची को उत्पन्न करने के लिए आवश्यक न्यूनतम संचालनों की संख्या क्या है। व्यवहार करें? एक सबूत है कि यह तुलना में तेजी से बढ़ता है , विशेष रूप से दिलचस्प होगा, क्योंकि यह मूल प्रश्न को नकारात्मक में हल करेगा।[1,2,...,N1,N][N,N1,...,2,1]O(N)


अद्यतन (15 जनवरी 2011): समस्या को में हल किया जा सकता है , जैसा कि प्रस्तुत जवाब और उनकी टिप्पणियों में दिखाया गया है; और की एक निचली सीमा तुच्छ है। क्या इनमें से कोई भी सीमा में सुधार किया जा सकता है?Ω ( N )O(NlogN)Ω(N)


स्पष्ट करने के लिए: "या तो कतार से अंतिम तत्व" क्या आप कतार के शीर्ष पर मौजूद तत्व का उल्लेख कर रहे हैं?
पीटर टेलर

@Peter: हाँ, स्पष्टीकरण के लिए धन्यवाद। मैंने प्रश्न संपादित किया है।
mjqxxxx

क्या इनपुट और आउटपुट दोनों सूची ढेर हैं? यदि ऐसा है, तो n op3s (उसी कतार में) n op3s द्वारा पीछा किया जाता है, ठीक है? मुझे लगता है कि मुझे कुछ महत्वपूर्ण याद आ रहा होगा।
जप्पल

@ जप्पल: नहीं, वे ढेर नहीं हैं। आपको इनपुट सूची से पढ़े गए विपरीत क्रम में तत्वों को आउटपुट सूची में लिखने की आवश्यकता है।
mjqxxxx 13

जवाबों:


11

यदि N दो की शक्ति है, तो मेरा मानना ​​है कि O (N लॉग एन) संचालन पर्याप्त है, यहां तक ​​कि कुछ हद तक प्रतिबंधित समस्या भी है, जिसमें सभी वस्तुएं कतारों में से किसी एक पर शुरू होती हैं और किसी एक कतार में उल्टे क्रम में समाप्त होनी चाहिए (बिना) इनपुट और आउटपुट सूची)।

O (N) चरणों में एक कतार पर सभी तत्वों के साथ शुरू करना संभव है, उन्हें "एक मेरे लिए एक आप" के रूप में बजाएं और उन्हें दूसरी कतार में सबसेट सब्सेट में विभाजित करें, और फिर उन सभी को एक कतार में वापस करें। वस्तुओं के पदों के द्विआधारी निरूपण के संदर्भ में, यह एक घूर्णन ऑपरेशन को लागू करता है।

O (N) चरणों में, एक कतार से तत्वों के जोड़े को खींचना, उन्हें स्वैप करना, फिर उन्हें वापस रखना संभव है, सभी जोड़ों को उलट देना। वस्तुओं के पदों के द्विआधारी प्रतिनिधित्व के संदर्भ में, यह स्थिति के निम्न क्रम बिट को पूरक करता है।

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


फिर आप सूची को बाइनरी प्रतिनिधित्व और ओ-एन (एनजी एन) एल्गोरिथ्म के लिए टुकड़ा-दर-टुकड़ा उल्टा कर सकते हैं, मुझे लगता है।
जप्‍पल

मैं सोच रहा था कि एक बाइनरी के बजाय 2-3 पेड़ का उपयोग करके सभी एन तक विस्तारित हो सकता है, लेकिन शायद आपका विचार सरल है। लेकिन आप ओ (एन लॉग एन) कुल चरणों में ओ (लॉग एन) टुकड़ों में से प्रत्येक को कैसे उल्टा करते हैं?
डेविड एपपस्टीन

समय है I से 0 से [lg n] के लिए O (राशि (2 ^ i) lg (2 ^ i)), जिसे वोल्फ्राम अल्फा कहते हैं O (n lg n): wolframalpha.com/input/?i-sum+ (2 ^ k) + log2 + (2 ^ k) + से + 0 + से + log2 + n
jbapple

निश्चित रूप से, यदि आप समय के प्रत्येक भाग को उसके लम्बाई के अनुपात में उसके लॉग में उलट सकते हैं, तो आप कर रहे हैं। लेकिन आपको इन टुकड़ों को उलटने के बाद ही कहीं रखना होगा, और इससे बचे हुए टुकड़ों को उलटना मुश्किल हो सकता है।
डेविड एप्पस्टीन

समस्या एक "आउटपुट सूची" प्रस्तुत करती है। क्या हम उन्हें वहां रख सकते हैं?
जाप्‍पल

1

Σमैं=0एन/2-1(एन-2मैं-2)

बाएँ और दाएँ के रूप में दो उपलब्ध कतारों को नाम दें। इस एल्गोरिथ्म का मूल विचार इस धारणा के साथ है कि N सम है:

  1. तत्वों की प्रारंभिक सूची से मान पढ़ें और सभी विषम संख्याओं को बाईं कतार में और यहां तक ​​कि संख्याओं को दाईं कतार में धकेलें
  2. एक मुट्ठी अधिकतम मूल्य का उत्पादन करने का सबसे तेज़ तरीका है एन / 2-1 तत्वों को दाईं कतार से बाईं ओर स्थानांतरित करना और सही मूल्य से शीर्ष मूल्य को आउटपुट सूची में डालना।
  3. अब हमें दूसरी कतार के लिए भी ऐसा ही करना है - बाईं कतार से N / 2-1 तत्वों को दाईं ओर स्थानांतरित करें और बाईं पंक्ति से शीर्ष तत्व को आउटपुट सूची में पॉप करें।
  4. N = N-2 के लिए पंक्ति 2 और 3 दोहराएं

यह देखना आसान है कि एल्गोरिदम को विषम एन के लिए कैसे काम करना चाहिए।


आप LaTeX-ish कोड (ऋण घटाकर) डालने के लिए $ ... $ का उपयोग कर सकते हैं ।
मार्क रीटब्लेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.