अधिकांश भाषाएं अधिकतम-ढेर कार्यान्वयन के बजाय न्यूनतम-ढेर क्यों प्रदान करती हैं?


19

मैंने अभी कुछ देखा है और मुझे आश्चर्य है कि क्या कोई कारण है। C ++ (std :: प्राथमिकता_queue एक अधिकतम ढेर है) को छोड़कर, मैं किसी अन्य भाषा को नहीं जानता जो अधिकतम हीप प्रदान करती है।

पायथन के हीपेक मॉड्यूल एक सूची के शीर्ष पर एक द्विआधारी न्यूनतम-ढेर को लागू करता है।

जावा के पुस्तकालय में एक प्रायोरिटी वर्ग है, जो एक न्यूनतम प्राथमिकता-कतार को लागू करता है।

गो की लाइब्रेरी में एक कंटेनर / हीप मॉड्यूल होता है, जो किसी भी संगत डेटा संरचना के शीर्ष पर न्यूनतम-ढेर को लागू करता है।

Apple के Core Foundation ढांचे में एक CFBinaryHeap संरचना शामिल है, जो एक न्यूनतम-ढेर को लागू करती है।

मैं मिन-हीप की तुलना में अधिक-से-अधिक सहज पाता हूं और मेरा मानना ​​है कि तकनीकी रूप से कार्यान्वयन अंतर केवल तुलना ऑपरेटर को बदलने का प्रश्न है। क्या कोई वास्तविक कारण है? अधिकांश अनुप्रयोगों को अधिकतम ढेर के बजाय एक मिनट की आवश्यकता होती है? अग्रिम में धन्यवाद


क्या वे वास्तव में एक ही चीज नहीं हैं? मैं तर्क के रूप में बंद करने के लिए मतदान करता हूं।

2
अभी कुछ दिनों पहले मुझे C ++ में एक मिनट हीप की आवश्यकता थी और वह थोड़ा नाराज था कि प्राथमिकता_एक अधिकतम ढेर तक चूक गई थी। इसने मुझे अपने कस्टम वर्ग पर ऑपरेटर को परिभाषित करने के लिए मजबूर किया, जिसमें पहले से ही ऑपरेटर <था। ग्राफ़ के साथ काम करते समय, आप आमतौर पर सबसे छोटे किनारों को प्राथमिकता देना चाहते हैं, इसलिए आपको न्यूनतम हीप की आवश्यकता होती है।
लाक

2
@ LaC: आप उपयोग कर सकते हैं std::not2(std::less<T>())

जवाबों:


9

जैसा कि दूसरों ने देखा है, अगर ढेर एक तुलनित्र को स्वीकार करता है, तो एक व्यवहार या दूसरे को प्राप्त करना बहुत मुश्किल नहीं है। हालाँकि, Google कोड का एक त्वरित उपयोग, यह बताता है कि बार-बार आने वाले दो अनुप्रयोगों की वजह से न्यूनतम-कोड वास्तविक कोड में अधिक प्रचलित है।

  • दिज्क्स्त्र / ए * / कई अन्य सबसे छोटे पथ एल्गोरिदम (क्योंकि आंशिक पथ लंबे समय तक मिलते हैं)।

  • इवेंट सिमुलेशन (क्योंकि समय आगे बढ़ता है)।

इसके अलावा, मैं यह तर्क दूंगा कि क्योंकि डिफ़ॉल्ट सॉर्ट छोटी से बड़ी वस्तु देता है, इसलिए डिफ़ॉल्ट ढेर होना चाहिए।


2
मैं आमतौर पर सी ++ में कार्यक्रम करता हूं, और इसके विपरीत आश्चर्य करता हूं: सी ++ एक न्यूनतम-ढेर क्यों लागू नहीं करता है? जैसा कि आपने कहा, अधिकांश एल्गोरिदम एक मिन-हीप का उपयोग करते हैं।
मार्टीन फिक्समैन

5

यह सिर्फ स्वाद की बात है। मुझे नहीं लगता कि कोई विशेष कारण होगा। यह कुछ लोगों को लागत को कम करने के रूप में अनुकूलन समस्याओं को व्यक्त करना पसंद है, जबकि अन्य लोग लाभ को अधिकतम करना पसंद करते हैं।


3

अधिकांश भाषाओं को मैं जानता हूं कि यह तय करने के लिए एक पैरामीटर को पारित करने की अनुमति है कि क्या यह एक न्यूनतम या अधिकतम-ढेर होना चाहिए। तो डिफ़ॉल्ट मान कुछ हद तक मनमाना है। मैं अधिकांश भाषाओं के लिए अनुमान लगाता हूं कि यह परिभाषित करने का एक प्रश्न है कि डिफ़ॉल्ट ऑपरेटर क्या है। सीएल के लिए सीएल में डिफ़ॉल्ट std::lessएक न्यूनतम-ढेर के लिए अग्रणी है।

std::lessहर जगह डिफ़ॉल्ट रूप से उपयोग करने की स्थिरता का मतलब है कि आपको केवल इस तुलना को लागू करना होगा जब आप किसी भी प्रकार की डेटा संरचना का उपयोग कर रहे हों और आपको यह निर्णय नहीं करना है कि आप अपनी कक्षाओं को डिज़ाइन करते समय किस डेटा संरचना का उपयोग करने जा रहे हैं। मुझे लगता है कि यह अन्य भाषाओं के लिए एकमात्र अंतर है कि तुलना में अधिक से अधिक मानक है।


3
मुझे नहीं लगता कि ऐसा कोई संबंध है। आप या तो <या> का उपयोग करके किसी भी प्रकार के ढेर को लागू कर सकते हैं। दरअसल, STL :: STL में डिफ़ॉल्ट कम है, लेकिन वे न्यूनतम ढेर के बजाय अधिकतम ढेर को लागू करते हैं।
लाक

1

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

आप हमेशा सूचकांक के 1 पूरक को ले कर एक से दूसरे में बदल सकते हैं।

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