मैं एक ढेर का उपयोग कब करना चाहूंगा?


91

प्राथमिकता कतार के स्पष्ट उत्तर के अलावा, मेरे प्रोग्रामिंग कारनामों में एक ढेर कब उपयोगी होगा?


8
यहाँ बहुत सारे अच्छे उत्तर हैं, इसलिए मैं "जब एक ढेर बस बहुत बड़ा नहीं होता है" के साथ झंकार करूँगा।
डॉन वर्व

जवाबों:


121

जब भी आपको सबसे बड़ी (या सबसे छोटी) वस्तु तक त्वरित पहुँच की आवश्यकता हो, इसका उपयोग करें, क्योंकि वह वस्तु हमेशा सरणी में या पेड़ की जड़ में पहला तत्व होगी।

हालाँकि, शेष सरणी को आंशिक रूप से अनसोल्ड रखा गया है। इस प्रकार, तत्काल पहुंच केवल सबसे बड़ी (सबसे छोटी) मद तक ही संभव है। आवेषण तेज़ हैं, इसलिए यह आने वाली घटनाओं या डेटा से निपटने का एक अच्छा तरीका है और हमेशा सबसे पहले / सबसे बड़ी पहुंच है।

प्राथमिकता कतार, अनुसूचियों (जहां जल्द से जल्द आइटम वांछित है), आदि के लिए उपयोगी ...

एक ढेर एक पेड़ है जहां एक मूल नोड का मूल्य उसके किसी भी वंशज नोड्स से बड़ा है।

यदि आप गहराई से रैखिक क्रम में संग्रहीत बाइनरी ट्री के रूप में एक ढेर के बारे में सोचते हैं, पहले रूट नोड के साथ (फिर उस नोड के बच्चे अगले, फिर उन नोड्स के बच्चे); तब सूचकांक N पर एक नोड के बच्चे 2N + 1 और 2N + 2 पर होते हैं। यह संपत्ति त्वरित पहुंच-दर-सूचकांक की अनुमति देती है। और जब से नोड्स को स्वैप करके हीप को हेरफेर किया जाता है, यह इन-प्लेस छँटाई के लिए अनुमति देता है।


3
ध्यान दें कि यह एक सुविधाजनक गारंटीकृत NlogN प्रकार हो सकता है जिसके लिए अतिरिक्त सरणी आवंटन की आवश्यकता नहीं है
Overflown

38
साक्षात्कार के सवालों के लिए यह जानने के लिए भी बहुत अच्छा है;)
vivekian2

21
@ vivekian2 केवल एक ही कारण मैं यहाँ हूँ क्योंकि मैं एक साक्षात्कार के बारे में हूँ।
बक्सर

सबसे बड़े (या सबसे छोटे) आइटम को ट्रैक करने के लिए एक सहायक स्टैक के साथ स्टैक क्लास का उपयोग क्यों न करें। रिट्रीवल ओ (1) है
रिधवान शकील

@RidhwaanShakeel यदि आप स्टैक का उपयोग करते हैं तो आपके आइटम को हमेशा सिर पर रखा जाएगा, क्या होगा यदि आइटम की स्थिति को आइटम की कुछ संपत्ति के आधार पर निर्धारित करना होगा जैसे कि सबसे बड़ी घटना (घटना में भाग लेने वाले लोगों की संख्या के आधार पर)।
संदीपगौड़ा

49

हीप्स संरचनाएं हैं जो न्यूनतम या अधिकतम तक त्वरित पहुंच की अनुमति देती हैं

लेकिन आप ऐसा क्यों चाहेंगे? आप यह देखने के लिए ऐड पर हर प्रविष्टि की जांच कर सकते हैं कि यह सबसे छोटा है या सबसे बड़ा। इस तरह से आपके पास हमेशा सबसे छोटा या निरंतर समय में सबसे बड़ा होता है O(1)

इसका उत्तर यह है कि ढेर आपको सबसे छोटा या सबसे बड़ा खींचने की अनुमति देता है और जल्दी से अगला सबसे छोटा या सबसे बड़ा पता है । इसलिए इसे प्राथमिकता कतार कहा जाता है।

वास्तविक विश्व उदाहरण (हालांकि, बहुत निष्पक्ष दुनिया नहीं):

मान लीजिए आपके पास एक अस्पताल है जिसमें रोगियों को उनकी उम्र के आधार पर भाग लिया जाता है। सबसे पुराने हमेशा पहले से ही उपस्थित होते हैं, कोई फर्क नहीं पड़ता जब वह कतार में मिलता है।

आप केवल सबसे पुराने का ट्रैक नहीं रख सकते क्योंकि यदि आप उसे बाहर निकालते हैं, तो आप अगले सबसे पुराने को नहीं जानते हैं। इस अस्पताल की समस्या को हल करने के लिए, आप एक अधिकतम ढेर को लागू करते हैं । यह ढेर, आंशिक रूप से आदेश दिया गया है। इसका मतलब है कि आप रोगियों को उनकी उम्र के अनुसार नहीं बना सकते हैं, लेकिन आप जानते हैं कि सबसे पुराने हमेशा ऊपर में होते हैं, इसलिए आप लगातार समय में एक मरीज को बाहर निकाल सकते हैं O(1)और लॉग समय में हीप को फिर से संतुलित कर सकते हैं O(log N)

अधिक परिष्कृत उदाहरण:

मान लीजिए कि आपके पास पूर्णांकों का अनुक्रम है और आप इसका ट्रैक रखना चाहते हैं median। माध्यिका वह संख्या है जो एक क्रमबद्ध सरणी के बीच में होती है।

उदाहरण:

[1, 2, 5, 7, 23, 27, 31]

उपरोक्त मामले में, 7माध्यिका है क्योंकि छोटी संख्याओं वाली सारणी [1, 2, 5]बड़ी संख्याओं वाले एक ही आकार की होती है [23, 27, 31]। आम तौर पर, यदि सरणी में तत्वों की एक विषम संख्या है, तो मध्य में 2 तत्वों का औसत अंकगणितीय औसत है, उदाहरण के लिए (5 + 7)/2

अब, आप माध्यिका का ट्रैक कैसे रखते हैं? 2 ढेर होने से , एक मिनट का ढेर वर्तमान मंझले की तुलना में छोटा होता है और एक अधिकतम ढेर जिसमें वर्तमान मंझला की तुलना में बड़ी संख्या होती है। अब, अगर ये ढेर हमेशा संतुलित रहते हैं, तो 2 ढेर में समान तत्व होंगे या एक में 1 तत्व होगा जो दूसरे की तुलना में अधिक है, सबसे।

जब आप अनुक्रम में एक नया तत्व जोड़ते हैं, यदि संख्या वर्तमान माध्यिका से छोटी है, तो आप इसे न्यूनतम हीप में जोड़ते हैं, अन्यथा, आप इसे अधिकतम हीप में जोड़ते हैं। अब, यदि ढेर असंतुलित होते हैं (एक हीप में 1 से अधिक तत्व होता है), तो आप एक तत्व को सबसे बड़े ढेर से खींचते हैं और सबसे छोटे में जोड़ते हैं । अब वे संतुलित हैं।


6
अधिक परिष्कृत उदाहरण अद्भुत है! मैं निश्चित रूप से कुछ समय यह कोशिश करने वाला हूँ। हालाँकि, मुझे लगता है कि आपके उदाहरण में एक छोटी सी गलती है। चूंकि हमें मध्य में दो तत्वों के औसत से माध्य प्राप्त करने की आवश्यकता है। मैं मान सकता हूं कि हमें वर्तमान माध्यिका से बड़ी संख्या को संचित करने के लिए एक न्यूनतम हीप का उपयोग करने की आवश्यकता है और वर्तमान माध्यिका से छोटी संख्या को संचित करने के लिए एक अधिकतम ढेर है। इस तरह से हम निरंतर समय में बीच में दो तत्वों को निकाल सकते हैं और माध्य की गणना कर सकते हैं? क्या मैं सही हूँ?
केल्विन कू

12

एक ढेर की विशेषता यह है कि यह एक संरचना है जो डेटा को बनाए रखता है; इस प्रकार, यह एक पूर्ण आदेश को बनाए रखने की लागत और यादृच्छिक अराजकता के माध्यम से खोज की लागत के बीच एक अच्छा व्यापार है। उस विशेषता का उपयोग कई एल्गोरिदम पर किया जाता है, जैसे चयन, आदेश, या वर्गीकरण।

एक ढेर की एक और उपयोगी विशेषता यह है कि इसे एक सरणी से इन-प्लेस बनाया जा सकता है!


3

चयन एल्गोरिदम के लिए भी अच्छा है (न्यूनतम या अधिकतम ढूँढना)


3

जब भी आप एक अस्थायी सूची को क्रमबद्ध करते हैं, तो आपको ढेर पर विचार करना चाहिए।


0

जब आप क्रमशः सबसे छोटे और बड़े तत्वों का उपयोग करना चाहते हैं, तो आप एक मिनहाप या मैक्सहैप का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.