क्या ओ (1) पुश / पॉप समय के साथ तीन स्टैक को एक सरणी में लागू किया जा सकता है?


9

दो स्टैक को एक निश्चित आकार के सरणी का उपयोग करके कुशलतापूर्वक लागू किया जा सकता है: स्टैक # 1 बाएं छोर से शुरू होता है और दाएं बढ़ता है, और स्टैक # 2 दाएं छोर से शुरू होता है और बाईं ओर बढ़ता है। क्या तीन स्टैक के लिए समान संभव है?

अधिक विशेष रूप से, क्या निम्नलिखित परिस्थितियों को देखते हुए तीन स्टैक लागू करना संभव है:

  1. आपके पास एक निश्चित आकार का सरणी है जो N ऑब्जेक्ट पकड़ सकता है।
  2. जब तक तीन स्टैक आकारों का योग <एन है, तब तक पुश () विफल नहीं होना चाहिए।
  3. दोनों पुश () और पॉप () संचालन को ओ (1) समय लेना चाहिए।
  4. सरणी के अतिरिक्त, आप केवल O (1) अतिरिक्त स्थान का उपयोग कर सकते हैं।

यहाँ समाधान के उदाहरण दिए गए हैं जो इन आवश्यकताओं को पूरा नहीं करते हैं:

  • सरणी को 3 निश्चित भागों में विभाजित करना और स्टैक के लिए प्रत्येक भाग का उपयोग करना (2 का उल्लंघन)।
  • ऊपर के समान लेकिन ढेर के बीच चल सीमाओं के साथ (उल्लंघन 3)।
  • सरल लिंक्ड-लिस्ट आधारित कार्यान्वयन (4 का उल्लंघन)।

मैं गैर-तुच्छ एल्गोरिदम या असंभव साक्ष्य स्वीकार करूंगा भले ही वे सभी शर्तों को पूरा न करें (1) - (4) बिल्कुल, उदाहरण के लिए, एक एल्गोरिथ्म जहां पुश / पॉप टेक ओ (1) amortized समय, या जहां अतिरिक्त मेमोरी O (N) से छोटी है, जैसे O (लॉग एन)। या एक असंभव साक्ष्य जो दर्शाता है कि उदाहरण के लिए, प्रति पुश / पॉप में सरणी के 5 से कम तत्वों तक पहुंच असंभव है।


1
मुझे नहीं पता कि क्या आप इसे आवश्यकता 4 के उल्लंघन के रूप में मानते हैं, लेकिन यदि आपके एन ऑब्जेक्ट्स सरणी में प्रत्येक "ऑब्जेक्ट" में एक अतिरिक्त फ़ील्ड शामिल हो सकता है जैसे कि पूर्णांक सूचकांक, तो आप अपने सरणी के अंदर "लिंक की गई सूचियों" को लागू कर सकते हैं। । आप 3 बाहरी चर का उपयोग करके प्रत्येक 3 ढेर के शीर्ष के सूचकांक को पकड़ सकते हैं, और प्रत्येक "ऑब्जेक्ट" पिछले तत्व को इंगित कर सकता है जो इसका स्टैक है।
एवी ताल

"ऑब्जेक्ट्स" से मेरा मतलब उन चीजों से है जो पुश () स्वीकार और पॉप () रिटर्न करती हैं। स्टैक कार्यान्वयन के दृष्टिकोण से, वे केवल डेटा के अपारदर्शी बूँदें हैं (उदाहरण के लिए, एक वस्तु 32-बिट पूर्णांक हो सकती है)। स्टैक कार्यान्वयन को इन ऑब्जेक्ट्स को किसी भी तरह से संशोधित नहीं करना चाहिए।
user1020406

1
विचार करें कि आप सबसे पहले क्या करते हैं Nपुश ऑपरेशन और फिर केवल पॉप ऑपरेशन करते हैं। क्या समस्या के इस संस्करण के बारे में कुछ पता है?
दिमित्री अर्बनोविच

चाहेंगे O(N)अतिरिक्त स्थान से आप संतुष्ट हैं?
दिमित्री अर्बनोविच

पुन: "एन पुश और फिर एन पॉप" संस्करण: मुझे नहीं पता, लेकिन यहां तक ​​कि इसे एक दिलचस्प उपप्रोग्राम के रूप में पहचानना उपयोगी है क्योंकि यहां तक ​​कि यह स्पष्ट नहीं है कि क्या एक ओ (1) समाधान संभव है। ऊपरी सीमा के लिए @ अलेक्सई का उत्तर और इसकी टिप्पणी धागा देखें। के रूप में एक के लिएO(N)समाधान, हाँ मैं स्वीकार करूँगा। मैं स्टेक्सएक्सचेंज पर सवाल पोस्ट करने में नया हूं, इसलिए मुझे यकीन नहीं है कि समय के साथ बेहतर और बेहतर समाधान प्रदान करने वाले मामलों को कैसे संभालना है। एक दृष्टिकोण जो मैंने देखा है वह यह था कि एक दिन इंतजार करने से पहले अगर कोई बेहतर पोस्ट किया जाता है तो उत्तर देने से पहले मैं ऐसा करूंगा।
user1020406

जवाबों:


6

फ्रेडमैन और गोल्डस्मिथ ने "थ्री स्टैक्स" (जर्नल ऑफ़ अल्गोरिद्म, 1994) में दिखाया Θ(nε)व्यर्थ अंतरिक्ष के बिट्स प्राप्त करने योग्य है। यह कम से कम 16 क्वाटुओरडेकिल योटोबाइट्स के आकार के सरणियों के लिए आवश्यक न्यूनतम है। मैंने एक सरल एल्गोरिथ्म को बर्बाद करने का वर्णन कियाΘ(n) मेरे StackOverflow में स्थान के शब्द इस प्रश्न का उत्तर देते हैं । जैसा कि @ dmitri-Urbanowicz ने टिप्पणियों में उल्लेख किया है, यह मूल रूप से सरणी को ही मान रहा हैn आकार के ब्लॉक n, जहां प्रत्येक ब्लॉक का उपयोग ठीक एक स्टैक के लिए किया जाता है और उस स्टैक में अगले ब्लॉक में एक एकल पॉइंटर होता है।


0

आज्ञा देना लंबाई की लंबाई हो सकता है अंतर्निहित सरणी। मैं बड़े विखंडू की लिंक की गई सूचियों के रूप में ढेर की कल्पना कर सकता हूं, ताकि कुल मिलाकर संख्या O (log2 (N)) से अधिक न हो। तीसरे स्टैक को N / 2 के सूचकांक में पहले दो के बीच रखें। इसलिए हमारे पास 3 कब्जे वाले क्षेत्र और 2 निःशुल्क हैं। जब एक स्टैक अगले तत्व को स्वीकार नहीं कर सकता है, तो इसका मतलब है कि एक मुक्त क्षेत्र समाप्त हो गया है। अगर दूसरा भी थक जाता है, तो पूरी स्मृति समाप्त हो जाती है। अन्यथा, एक और मुक्त क्षेत्र है जिसका आकार N / 2 से अधिक नहीं है। उस मुक्त क्षेत्र में अतिप्रवाहित स्टैक को जारी रखें। ताकि पूरे विन्यास ढेर के प्रारंभिक लेआउट जैसा दिखता है। चूंकि मुफ्त मेमोरी अब प्रारंभिक के आधे से अधिक नहीं है, ऐसे लिंकिंग ऑपरेशनों के लॉग 2 (एन) से अधिक नहीं होगा। प्रत्येक लिंकिंग ऑपरेशन में स्टैक की पिछली स्थिति को बचाने के लिए निश्चित मात्रा में मेमोरी की आवश्यकता होती है। इसलिए,


1
आप एक बड़े हिस्से से चीजों को पॉपिंग करके प्राप्त मेमोरी को कैसे रीसायकल करते हैं?
एमिल जेकाबेक

अच्छा प्रश्न। त्वरित उत्तर यह है कि ठग जो मुक्त हो जाता है वह अपनी स्मृति को उस मुक्त क्षेत्र में लौटाता है जहां से इसे पहले लिया गया था। लेकिन क्या होगा अगर मुक्त क्षेत्र उस चंक के लिए आवंटन मेमोरी के समय से सिकुड़ गया है, और चंक अब इसके साथ सटे नहीं है? यह मुक्त स्मृति के विखंडन की ओर जाता है, 2 से अधिक मुक्त क्षेत्र हो सकते हैं, जो मेरे सभी निर्माण को बर्बाद कर देता है।
एलेक्सी काएगोरोडोव

पोपिंग वास्तव में यहाँ समस्या है, लेकिन अलेक्सई का निर्माण समस्या के संस्करण के लिए एक अच्छा ऊपरी बंधन प्रदान करता है, जो कि दिमित्री ने टिप्पणियों में पूछा था: क्या होगा अगर हमें सभी चबूतरे से पहले होने वाले सभी पुश की आवश्यकता होती है? मुझे आश्चर्य है कि क्या इस मामले में ओ (लॉग एन) से बेहतर कुछ भी संभव है।
user1020406
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.