मैं आमतौर पर उत्पादन सॉफ़्टवेयर में एक Deque का उपयोग कहां करूंगा?


21

मैं सॉफ्टवेयर अनुप्रयोगों में ढेर, कतारों और पेड़ों का उपयोग करने के लिए काफी परिचित हूं, लेकिन मैंने इससे पहले कभी भी एक Deque (Double Ended Queue) का उपयोग नहीं किया है। मैं आम तौर पर जंगल में उनका सामना कहाँ करूँगा? क्या यह कतार के समान स्थानों पर होगा लेकिन अतिरिक्त ग्रिबिली के साथ होगा?



लगता है कि इस धागे में कुछ भ्रम है। इंटरनेट पर "deque" एक डबल-एंडेड कतार है (विकिपीडिया उल्लेख सूची कार्यान्वयन को उल्लेखित करता है)। हालांकि C ++ STL में, "std :: deque" एक सरणी जैसी संरचना है, जिसे डेटा ब्लॉक की सरणी के रूप में कार्यान्वित किया जाता है। यह std :: वेक्टर के समान यादृच्छिक अभिगम प्रदान करता है, लेकिन इसकी आकार क्षमता std :: सूची के करीब है क्योंकि जैसे ही डेटा जोड़ा जाता है, यह ब्लॉक जोड़ता है और मौजूदा डेटा को फिर से विभाजित और स्थानांतरित नहीं करता है।
DXM

1
@DXM: एक एसटीएल डॉक हालांकि अभी भी एक डबल-एंडेड कतार है और सिरों पर तेज संचालन प्रदान करता है (कार्यान्वयन के आधार पर)। यह मध्य तक पहुंच प्रदान करता है और साथ ही इसके प्राथमिक संचालन को कम कतार जैसा नहीं बनाता है।
gbjbaanb 14

@ जीबीजैनब: सभी मैं कह रहा हूं कि यदि आप 3 वर्गों के सार्वजनिक इंटरफेस को देखते हैं: एसटीडी :: वेक्टर, एसटीडी :: सूची (या एसडी :: कतार) और एस डी डी :: आप उस एसटी को देखेंगे: वेक्टर और std :: deque में समान सार्वजनिक इंटरफ़ेस है और समान क्षमता (std :: deque बड़े मेमोरी फ़ुटप्रिंट की कीमत पर थोड़ी अधिक लचीली है)। std :: list and std :: दूसरी ओर कतार उनके सीएस काउंटर-पार्ट्स, लिंक्ड-लिस्ट और कतार की तरह अधिक व्यवहार करती है। CS deque! = Std :: deque
DXM

मुझे यह उत्तर shiv.mymail द्वारा अधिक व्यावहारिक लगता है - stackoverflow.com/questions/3880254/…
roottraveller

जवाबों:


21

जिस तरह से एक छल का उपयोग किया जाता है वह "उम्र" वस्तुओं के लिए होता है। यह आमतौर पर एक पूर्ववत या इतिहास सुविधा के रूप में उपयोग किया जाता है। एक नया एक्शन डाला गया है। सबसे पुराने आइटम सामने हैं। छल के आकार की एक सीमा कुछ बिंदुओं पर हटाए जाने वाले मोर्चे पर वस्तुओं को बाध्य करती है क्योंकि नई वस्तुओं को डाला जाता है (सबसे पुराना आइटम)। यह तब संरचना के दोनों सिरों तक पहुंचने का एक तेज़ तरीका प्रदान करता है क्योंकि आप तुरंत सबसे पुराने और नवीनतम वस्तुओं को जानते हैं या तो सामने वाले को हटा दें और O (1) या O (1) समय में पूर्ववत करें।


मुझे नहीं लगता कि यहां देवताओं का उपयोग किया जाता है / जरूरत है। एक साधारण (शायद आकार-सीमित) स्टैक पर्याप्त है।
कोनराड रुडोल्फ

2
@Konrad आप एक साधारण स्टैक में आइटम को कैसे आयु देते हैं? (यानी आप "बहुत पुराने" जैसी आज्ञाओं को कैसे हटाते हैं?)
एंड्रेस एफ

@AndresF। क्या ढेर आकार से स्वतंत्र है? यदि ऐसा है, तो मैंने इस डेटा संरचना के बारे में कभी नहीं सुना है। अन्यथा यह केवल निश्चित आकार के साथ एक स्टैक है जिसे एक डॉक के संदर्भ में लागू किया जा सकता है , या बस निश्चित आकार के स्टैक नामक एक सरल डेटा संरचना को पोस्ट करके किया जा सकता है।
कोनराड रुडोल्फ

तो देवता सभी के बाद उपयोगी होते हैं ;) एक निश्चित आकार के ढेर के बारे में कभी नहीं सुना (इस अर्थ में कि आप सबसे पुराने आइटम को हटाने के लिए)। यह समझ में आता है, लेकिन यह आमतौर पर "स्टैक" का मतलब नहीं है, और क्या यह वास्तव में सरल होना बाकी है :)
एंड्रेस एफ

यह मूल प्रश्न की टिप्पणियों में पोस्ट किया गया था: en.wikipedia.org/wiki/Double-ended_queue यह सिर्फ एक डबल एंडेड कतार है। मैंने इसे ऊपर बताए गए तरीके से प्रयोग किया है (इसीलिए मैंने इसे पोस्ट किया है)। एक सच्चे स्टैक में, आपके पास एकमात्र संचालन होना चाहिए जो पुश, पॉप, टॉप और झांकना है (हम दूसरों से बहस कर सकते हैं, लेकिन यह आमतौर पर यह है)। आपको इस बात का कोई ज्ञान नहीं होना चाहिए कि स्टैक के तल पर क्या है या नीचे तक कैसे पहुंचें। जब आप इसे भरते हैं तो एक "निश्चित आकार के स्टैक" में आप बूढ़े हो चुके पुराने सामानों के बजाय स्टैक ओवरफ्लो उत्पन्न करेंगे।
jmq

1

बहुत बढ़िया सवाल। मुझे याद नहीं है कि हमारा CS 102 पाठ्यक्रम डबल-एंडेड कतार के लिए एक भी आवेदन का उल्लेख कर रहा है।

आज तक, मुझे पता है कि एकमात्र आवेदन विकिपीडिया लेख में वर्णित कार्य-चोरी शेड्यूलर है ।

यह अनिवार्य रूप से निम्नानुसार काम करता है:

एक सामान्य, एकल-थ्रेडेड प्रक्रियात्मक मॉडल में, प्रत्येक फ़ंक्शन कॉल तथाकथित कॉल स्टैक पर एक सक्रियण रिकॉर्ड को धकेलता है । एक सक्रियण रिकॉर्ड में स्थानीय चर और उस कॉल के पैरामीटर होते हैं। एक बार विधि के लिए कॉल पूरा होने पर ("रिटर्न"), अंतिम सक्रियण रिकॉर्ड कॉल स्टैक से पॉप होता है।

यह विशेष रूप से महत्वपूर्ण है क्योंकि इस तरह से पुनरावर्तन लागू किया जाता है: कॉल स्टैक की वर्तमान स्थिति में पुनरावर्तन की संरचना का प्रतिनिधित्व किया जाता है।

एक पुनरावर्ती एल्गोरिदम को समानांतर करते समय, हम कॉल स्टैक के साथ कॉल स्टैक को प्रतिस्थापित करके इस संपत्ति का शोषण कर सकते हैं। अभिकलन में प्रत्येक थ्रेड को अपनी स्वयं की कॉल कतार मिलती है और अनुक्रमिक निष्पादन की तरह धकेलती है और सक्रियण रिकॉर्ड करती है।

लेकिन एक बार जब एक थ्रेड ने अपना काम पूरा कर लिया है (= इसकी कॉल कतार खाली है), यह "गलत" छोर से हटाकर उस थ्रेड की कॉल कतार से एक सक्रियण रिकॉर्ड को हटाकर दूसरे धागे से काम चुरा लेता है

असल में, कॉल कतार दो कॉल स्टैक के रूप में कार्य करती है जो अब दो थ्रेड की सेवा करती है।


क्या इसके लिए आपके पास स्रोत है? दिलचस्प लगता है।
kyjelly90210

1
@ रिचर्ड 1987 विकिपीडिया लेख मूल पेपर का हवाला देता है। उदाहरण के लिए, कई कार्यान्वयन मौजूद हैं, उदाहरण के लिए GNU c ++ stdlib समानांतर विस्तार कार्य-चोरी कार्यान्वयन (लेकिन कोड पढ़ने में भयानक है) या आपके द्वारा सामान्य रूप से विभाजित और जीत के समानांतर कार्यान्वयन (लेकिन बाद में बहुत ही मुहावरेदार प्रोग्रामिंग शैली का उपयोग करता है) विशेष रूप से पुस्तकालय और इस तरह पढ़ने के लिए कठिन)
कोनराड रूडोल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.