बाइनरी मिन-हीप में वृद्धि-कुंजी और कमी-कुंजी


17

बाइनरी हीप की कई चर्चाओं में, सामान्य रूप से केवल कमी-कुंजी को मिन-हीप के लिए समर्थित संचालन के रूप में सूचीबद्ध किया गया है। उदाहरण के लिए, CLR अध्याय 6.1 और यह विकिपीडिया पृष्ठ । सामान्य रूप से मिन-हीप के लिए सूचीबद्ध कुंजी क्यों नहीं बढ़ी है? मुझे लगता है कि ओ (ऊंचाई) में यह संभव है कि अपने बच्चों की न्यूनतम के साथ बढ़े हुए तत्व (एक्स) की पुनरावृति करके, जब तक कि उसका कोई भी बच्चा एक्स से बड़ा न हो।

जैसे

IncreaseKey(int pos, int newValue)
{
   heap[pos] = newValue;
   while(left(pos) < heap.Length)
   {
      int smallest = left(pos);
      if(heap[right(pos)] < heap[left(pos)])
         smallest = right(pos);
      if(heap[pos] < heap[smallest])
      { 
         swap(smallest, pos);
         pos= smallest;
      }
      else return;
   }   
}

क्या उपरोक्त सही है? यदि नहीं, तो क्यों? यदि हाँ, तो मिन-हीप के लिए सूचीबद्ध कुंजी क्यों नहीं बढ़ाई गई है?


1
सभी उत्तरों को पढ़ने के बाद, मैं कहता हूं, यह एक अजीब चूक है, जो शायद ऐतिहासिक रूप से दीजकस्ट्रा एल्गोरिदम में न्यूनतम-हीप के उपयोग के कारण होता है।
Maaartinus

3
आप निश्चित रूप से एक प्रविष्टि के बाद हटाए गए का उपयोग करके हमेशा वृद्धि-कुंजी को लागू कर सकते हैं, और हटाएं-मिनट के बाद कमी-कुंजी (-by) के रूप में स्वयं को हटा सकते हैं।
डेवमैक

@maaartinus टिप्पणी सही उत्तर है।
अधिकतम

जवाबों:


6

आपके द्वारा सुझाया गया एल्गोरिदम बस ढेर है। और वास्तव में - यदि आप एक मिनट-हीप में एक तत्व के मूल्य को बढ़ाते हैं, और फिर उसके उपप्रकार को ढेर करते हैं, तो आप एक कानूनी न्यूनतम-ढेर के साथ समाप्त हो जाएंगे।


तब सीएलआर या विकिपीडिया सूची एक समर्थित ऑपरेशन होने के लिए कुंजी क्यों नहीं बढ़ाती है? इसने मुझे यह सोचने के लिए गुमराह किया कि यह एक मिनट-ढेर में संभव नहीं है
GatotPujo

मैं मानता हूं कि यह भ्रामक है, लेकिन मुझे एल्गोरिथ्म में कोई गलती नहीं दिखती है।
शाऊल

5

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

द्विआधारी ढेर अमूर्त डेटा संरचना प्राथमिकता कतार को लागू करते हैं, जो संचालन के लिए कहता है_ खाली, add_element (अपनी प्राथमिकता के साथ एक कुंजी), find_min, और delete_min। अधिक उन्नत कतारें भी कुंजी की प्राथमिकता को कम करने की अनुमति देती हैं (एक min_heap में) या यहां तक ​​कि इसे बढ़ा सकती हैं। वास्तव में, आपने एक कार्यान्वयन दिया है।

दो टिप्पणी। आपका ऑपरेशन heapify फ़ंक्शन में उपयोग किया जाता है, जो कुशलता से एक सरणी से एक हीप का निर्माण करता है। Heapify में आपका ऑपरेशन दोहराया जाता है (अंतिम कुंजी से शुरू)।

फिर, सबसे महत्वपूर्ण बात, आपका कोड नोड की स्थिति का उपयोग करता है। शुद्ध डेटा संरचना प्राथमिकता कतार के लिए जो धोखा दे रही है। वह डेटा संरचना एक निश्चित ऑपरेशन को एक कुंजी देने के लिए कहती है। इसलिए किसी तत्व की प्राथमिकता को कम करने या बढ़ाने के लिए, आपको पहले इसका पता लगाना होगा। मुझे लगता है कि इसका मुख्य कारण यह सूचीबद्ध नहीं है।


1
स्पष्टीकरण के लिए धन्यवाद। हालाँकि, CLR कमी कुंजी में भी एक पैरामीटर के रूप में नोड के रूप में स्थिति है।
गतोत्पुजो

तुम सही हो। मुझे CLRS के Sect.6.5 में प्राथमिकता कतारों की परिभाषा में इस विषमता का कोई कारण नहीं मिला। इस अध्याय के अनुप्रयोग हीप्सॉर्ट में नोट वृद्धि-कुंजी का उपयोग नहीं किया गया है। ऐसा लगता है कि वृद्धि और कमी के बीच की विषमता केवल उस तरीके से संबंधित है जिस तरह से डेटा संरचना का उपयोग किया जाता है जैसे कि डीजकस्ट्रा के एल्गोरिथ्म में। वहाँ (एक मिनट के ढेर का उपयोग करके) कुछ चुने हुए नोड्स अधिक तत्काल हो सकते हैं और ढेर में 'ऊपर' चले जाते हैं।
हेंड्रिक जान

0

मुझे लगता है कि पहली बात यह है कि एक समर्थित ऑपरेशन क्या है?

क्या "एक विशिष्ट, निश्चित कुंजी के साथ एक मूल्य सम्मिलित करना" (जैसे पूर्णांक दायरे से ली गई कुंजियों के लिए, कुंजी = 3 के साथ सम्मिलित करना) मिन हीप के लिए एक समर्थित ऑपरेशन के अनुरूप है?

नहीं, क्योंकि उस ऑपरेशन को सामान्य रूप से अधिक समर्थित अभियानों के साथ तुच्छ रूप से लागू किया जा सकता है। इसी तरह, एक बार में 2 तत्वों को डालने से एक्सिसिटिंग insertऑपरेशन किया जा सकता है ।

दूसरी ओर, insertकार्यान्वयन विवरण को उजागर करने के बजाय ऑपरेशन को परिभाषित नहीं किया जा सकता है। यह विकिपीडिया पृष्ठ पर सूचीबद्ध परिचालनों के लिए बहुत अधिक है, heapifyसिवाय इसके, जिसे संभवतः एक अनुक्रम द्वारा कार्यान्वित किया जा सकता है insert

दूसरे शब्दों में, प्रकार पर प्रदान किए जाने वाले प्राथमिक संचालन हैं, जो उनके लिए अच्छा प्रदर्शन करने के लिए कार्यान्वयन विवरणों के लिए बाध्य हैं, और अन्य संचालन भी हैं, जो उस नियम का पालन नहीं करते हैं, और इस प्रकार एक संयोजन के रूप में लागू किया जा सकता है विहितों का।

मन में उस परिभाषा के साथ, क्या आपको लगता है कि प्रदर्शन के नुकसान के बिना वृद्धि-कुंजी को अन्य समर्थित संचालन के साथ लागू किया जा सकता है? यदि ऐसा है, तो यह उपरोक्त परिभाषा के अनुसार एक समर्थित ऑपरेशन नहीं है, अन्यथा, आप अच्छी तरह से सही हो सकते हैं।

संभवतया, मेरे द्वारा प्रदान किए गए एक समर्थित ऑपरेशन की परिभाषा मेरा है, जहां तक ​​मुझे पता है। यह औपचारिक नहीं है, और इस तरह चर्चा के अधीन है (हालांकि यह मुझे बहुत स्पष्ट लगता है)। हालाँकि, मुझे खुशी होगी कि अगर कोई ऐसा स्रोत प्रदान कर सकता है जो स्पष्ट रूप से और स्पष्ट रूप से परिभाषित करता है कि डेटाटाइप्स के लिए एक समर्थित ऑपरेशन क्या है, या कम से कम इसे मेरे मुकाबले बेहतर शब्दों में परिभाषित करें (क्या यह CLR में दी गई परिभाषा है? मेरे पास कॉपी नहीं है? )।

मेरा दूसरा बिंदु इस बात पर होगा कि हम एक प्राथमिकता कतार को कैसे परिभाषित करते हैं (जो कि बाइनरी हीप्स का raison d'être है)। क्या increase_keyउस डेटाटाइप के लिए एक आवश्यक ऑपरेशन यानी इसके उचित उपयोग के लिए?

जैसा कि आप देख सकते हैं कि मेरा कोण सभी परिभाषाओं के बारे में है। मैं वास्तव में आपके प्रश्नों का उत्तर नहीं देता, केवल कुछ संकेत देता हूं, इसलिए संवर्द्धन का स्वागत है।


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

बहुत अच्छी बात है। मेरा नज़रिया थोड़ा सीमित है, ऐसा लगता है। वास्तव में, @HendrikJan उत्तर बहुत अच्छी व्याख्या लाता है।
दीदीरेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.