2010-06-30 6 views
21

मैं सोच रहा था कि ढेर अवधारणा को एल्गोरिदम के रूप में लागू किया गया है (make_heap, pop_heap, push_heap, sort_heap) एक कंटेनर के बजाय। मुझे विशेष रूप से दिलचस्पी है कि किसी का समाधान यह भी समझा सकता है कि क्यों set और map एल्गोरिदम के समान संग्रह (make_set add_set rm_set आदि) के बजाय कंटेनर हैं।कंटेनरों के बजाय एल्गोरिदम के रूप में लागू सी ++ में ढेर क्यों हैं?

+4

रिकॉर्ड के लिए, वहाँ एक ढेर है आधारित कंटेनर: 'priority_queue'। – avakar

+0

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

+0

चूंकि कुछ लोगों को उलझन में लग रहा है: केटीएस डेटा संरचना [http://en.wikipedia.org/wiki/Heap_(data_structure)] को नि: शुल्क स्टोर नहीं कर रहा है। –

उत्तर

10

एसटीएल एक std :: primary_queue के रूप में एक ढेर प्रदान करता है। Make_heap, इत्यादि, फ़ंक्शंस वहां हैं क्योंकि उनके पास डेटा संरचना के दायरे के बाहर उपयोग होता है (उदाहरण के लिए सॉर्टिंग), और कस्टम संरचनाओं के शीर्ष पर ढेर बनाने की अनुमति देने के लिए (जैसे "शीर्ष 10 रखें" कंटेनर)।

समानता के अनुसार, आप एक क्रमबद्ध सूची को स्टोर करने के लिए std :: set का उपयोग कर सकते हैं, या आप std :: adjacent_find के साथ वेक्टर पर std :: sort का उपयोग कर सकते हैं; std :: sort अधिक सामान्य उद्देश्य है और अंतर्निहित डेटा संरचना के बारे में कुछ मान्यताओं को बनाता है।

(एक नोट के रूप में, std :: priority_queue कार्यान्वयन वास्तव में अपने स्वयं के भंडारण के लिए प्रदान नहीं करता है;। डिफ़ॉल्ट रूप से यह एक std :: अपने समर्थन की दुकान के रूप वेक्टर बनाता है)

1

खैर, ढेर वास्तव में एक सेट या नक्शा के समान अर्थ में एक सामान्य कंटेनर नहीं हैं। आमतौर पर, आप कुछ अन्य सार डेटा प्रकार को लागू करने के लिए एक ढेर का उपयोग करते हैं। (सबसे स्पष्ट प्राथमिकता कतार है।) मुझे संदेह है कि यह विभिन्न उपचार का कारण है।

5

एक स्पष्ट कारण यह है कि आप तत्वों को के अंदर एक और कंटेनर के रूप में व्यवस्थित कर सकते हैं।
तो आप make_heap() पर vector या deque या यहां तक ​​कि एक सी सरणी पर भी कॉल कर सकते हैं।

4

एक ढेर एक विशिष्ट डेटा संरचना है। मानक कंटेनरों में जटिलता की आवश्यकता होती है लेकिन यह निर्दिष्ट नहीं करती कि उन्हें कैसे कार्यान्वित किया जाना है। यह एक अच्छा लेकिन महत्वपूर्ण भेद है। आप कई अलग-अलग कंटेनर पर make_heap कर सकते हैं, जिसमें आपने स्वयं लिखा है। लेकिन set या map का अर्थ केवल डेटा व्यवस्थित करने का एक तरीका है।

एक और तरीका कहा, एक मानक कंटेनर केवल अंतर्निहित डेटा संरचना से अधिक है।

4

हीप्स * अंतर्निहित डेटा संरचना के रूप में लगभग एक सरणी का उपयोग करके लागू किया जाता है। इस तरह इसे एल्गोरिदम का एक सेट माना जा सकता है जो सरणी डेटा संरचना पर काम करता है। यह वह रास्ता है जिसे एसटीएल ने ढेर को लागू करते समय लिया - यह किसी भी डेटा संरचना पर काम करेगा जिसमें यादृच्छिक अभिगम इटरेटर (मानक सरणी, वेक्टर, डेक इत्यादि) हैं।

आप यह भी देखेंगे कि एसटीएल प्राथमिकता_क्यू को एक कंटेनर की आवश्यकता होती है (जो डिफ़ॉल्ट रूप से एक वेक्टर है)। यह अनिवार्य रूप से आपके ढेर कंटेनर है - यह आपके अंतर्निहित डेटा संरचना पर एक ढेर लागू करता है और सभी सामान्य ढेर परिचालनों के लिए एक रैपर कंटेनर प्रदान करता है।

* विशेष रूप से बाइनरी ढेर। ढेर के अन्य रूप (द्विपक्षीय, फाइबोनैकी, आदि) नहीं हैं।

संबंधित मुद्दे