मिन-मैक्स हीप

कंप्यूटर विज्ञान में, न्यूनतम-अधिकतम हीप पूर्ण बाइनरी ट्री डेटा संरचना है जो न्यूनतम-हीप और अधिकतम-हीप दोनों की उपयोगिता को जोड़ती है, अर्थात, यह न्यूनतम और अधिकतम दोनों अवयवों की निरंतर समय पुनर्प्राप्ति और लॉगरिदमिक समय निष्कासन प्रदान करती है। यह डबल-एंड प्रायोरिटी क्यू को लागू करने के लिए न्यूनतम-अधिकतम हीप को बहुत ही उपयोगी डेटा संरचना बनाता है। बाइनरी न्यूनतम-हीप और अधिकतम-हीप के जैसे, न्यूनतम-अधिकतम हीप लॉगरिदमिक इन्सर्टेसन और डेलेसन का समर्थन करते हैं और रैखिक समय में बनाए जा सकते हैं। न्यूनतम-अधिकतम हीप को प्रायः सरणी में इम्प्लिसिटी रूप से दर्शाया जाता है; इसलिए इसे इम्प्लिसिटी डेटा संरचना के रूप में जाना जाता है।

न्यूनतम-अधिकतम हीप गुण है: ट्री में सम स्तर पर प्रत्येक नोड उसके सभी वंशजों से कम है, जबकि ट्री में विषम स्तर पर प्रत्येक नोड उसके सभी वंशजों से बड़ा है।

संरचना को अन्य क्रम-सांख्यिकी ऑपरेशन को कुशलतापूर्वक समर्थन देने के लिए भी सामान्यीकृत किया जा सकता है, जैसे कि,  ,  (संरचना में kवां सबसे छोटा मान निर्धारित करें) और ऑपरेशन   (संरचना में kवां सबसे छोटा मान हटाएं), k के किसी निश्चित मान (या मानों के समूह) के लिए। इन अंतिम दो ऑपरेशनों को क्रमशः स्थिर और लघुगणकीय समय में कार्यान्वित किया जा सकता है। न्यूनतम-अधिकतम क्रमण की धारणा को अधिकतम या न्यूनतम-क्रमण के आधार पर अन्य संरचनाओं तक बढ़ाया जा सकता है, जैसे लेफ्टिस ट्री, डेटा संरचनाओं का नवीन (और अधिक शक्तिशाली) वर्ग उत्पन्न करते हैं। बाहरी क्विकसॉर्ट लागू करते समय न्यूनतम-अधिकतम हीप भी उपयोगी हो सकता है।

विवरण

 * न्यूनतम-अधिकतम हीप पूर्ण बाइनरी ट्री है जिसमें वैकल्पिक न्यूनतम (या सम) और अधिकतम (या विषम) स्तर होते हैं। सम स्तर उदाहरण के लिए 0, 2, 4, आदि हैं, और विषम स्तर क्रमशः 1, 3, 5, आदि हैं। हम अगले बिंदुओं में मानते हैं कि मूल अवयव पहले स्तर पर है, अर्थात 0।


 * न्यूनतम-अधिकतम हीप में प्रत्येक नोड में डेटा सदस्य (सामान्यतः कुंजी कहा जाता है) होता है जिसका मान न्यूनतम-अधिकतम हीप में नोड के क्रम को निर्धारित करने के लिए उपयोग किया जाता है।


 * मूल अवयव न्यूनतम-अधिकतम हीप में सबसे छोटा अवयव है।
 * दूसरे स्तर के दो अवयवों में से एक, जो अधिकतम (या विषम) स्तर है, न्यूनतम-अधिकतम हीप में सबसे बड़ा अवयव है
 * मान लीजिए $$x$$ न्यूनतम-अधिकतम हीप में कोई नोड है।
 * यदि $$x$$ न्यूनतम (या सम) स्तर पर है, तो रूट $$x.key$$ के साथ उपट्री में सभी कुंजियों के बीच $$x$$ न्यूनतम कुंजी है।
 * यदि $$x$$ अधिकतम (या विषम) स्तर पर है, तो रूट $$x.key$$ के साथ उपट्री में सभी कुंजियों के बीच $$x$$ अधिकतम कुंजी है।
 * न्यूनतम (अधिकतम) स्तर पर नोड को न्यूनतम (अधिकतम) नोड कहा जाता है।

अधिकतम-न्यूनतम हीप को समान रूप से परिभाषित किया गया है; ऐसे हीप में, अधिकतम मान रूट पर संग्रहीत होता है, और सबसे छोटा मान रूट के बच्चों में से पर संग्रहीत होता है।

ऑपरेशन
निम्नलिखित ऑपरेशनों में हम मानते हैं कि न्यूनतम-अधिकतम हीप को सरणी  में दर्शाया गया है; सरणी में $$ith$$ स्थान हीप में स्तर $$\lfloor \log i \rfloor$$ पर स्थित नोड के अनुरूप होगा।

बिल्ड
न्यूनतम-अधिकतम हीप का बिल्ड फ़्लॉइड के रैखिक-समय हीप बिल्ड एल्गोरिदम के अनुकूलन द्वारा पूर्ण किया जाता है, जो नीचे से ऊपर की ओर बढ़ता है। एक विशिष्ट फ़्लॉइड का बिल्ड-हीप एल्गोरिदम इस प्रकार है:

function FLOYD-BUILD-HEAP(h):

for each index i from $$\lfloor length(h) / 2 \rfloor$$ down to 1 do:

push-down(h, i) return h इस फलन में, h प्रारंभिक सरणी है, जिसके अवयवों को न्यूनतम-अधिकतम हीप गुण के अनुसार क्रमबद्ध नहीं किया जा सकता है। न्यूनतम-अधिकतम हीप के  ऑपरेशन (जिसे कभी-कभी हेपिफाई भी कहा जाता है) को आगे समझाया गया है।

पुश डाउन
एल्गोरिदम (या  जैसा कि इसे कहा जाता है ) इस प्रकार है:

function PUSH-DOWN(h, i):

if i is on a min level then: PUSH-DOWN-MIN(h, i)

else: PUSH-DOWN-MAX(h, i) endif

पुश डाउन न्यूनतम
function PUSH-DOWN-MIN(h, i): if i has children then: m := index of the smallest child or grandchild of i

if m is a grandchild of i then: if h[m] < h[i] then:

swap h[m] and h[i] if h[m] > h[parent(m)] then:

swap h[m] and h[parent(m)] endif

PUSH-DOWN(h, m) endif else if h[m] < h[i] then: swap h[m] and h[i] endif endif

अधिकतम पुश-डाउन
के लिए एल्गोरिदम पुश-डाउन-मिन के समान है, परन्तु सभी तुलना ऑपरेटर उत्क्रमित हो गए हैं।

function PUSH-DOWN-MAX(h, i): if i has children then:

m := index of the largest child or grandchild of i if m is a grandchild of i then:

if h[m] > h[i] then: swap h[m] and h[i] if h[m] < h[parent(m)] then:

swap h[m] and h[parent(m)] endif

PUSH-DOWN(h, m) endif else if h[m] > h[i] then: swap h[m] and h[i] endif endif

पुनरावृत्त रूप
चूंकि  और   पुनरावर्ती कॉल पश्च की स्थिति में हैं, इन प्रकार्यों को निरंतर स्थान में निष्पादित होने वाले विशुद्ध रूप से पुनरावृत्त रूपों में परिवर्तित किया जा सकता है: function PUSH-DOWN-ITER(h, m): while m has children then: i := m if i is on a min level then: m := index of the smallest child or grandchild of i if h[m] < h[i] then: swap h[m] and h[i] if m is a grandchild of i then: if h[m] > h[parent(m)] then:

swap h[m] and h[parent(m)] endif

else break endif else break endif else: m := index of the largest child or grandchild of i if h[m] > h[i] then: swap h[m] and h[i] if m is a grandchild of i then: if h[m] < h[parent(m)] then: swap h[m] and h[parent(m)] endif else break endif else break endif endif endwhile

इन्सर्टेसन
न्यूनतम-अधिकतम हीप में अवयव जोड़ने के लिए निम्नलिखित निष्पादन करें:


 * 1) न्यूनतम-अधिकतम हीप का प्रतिनिधित्व करने वाली सरणी के (अंत में) आवश्यक कुंजी जोड़ें। इससे संभवतः न्यूनतम-अधिकतम हीप गुण टूट जाएंगे, इसलिए हमें हीप को समायोजित करने की आवश्यकता है।
 * 2) नवीन कुंजी की उसके मूल कुंजी से तुलना करें:
 * 3) यदि यह मूल से कम (अधिक) पाया जाता है, तो यह निश्चित रूप से अधिकतम (न्यूनतम) स्तरों पर अन्य सभी नोड की तुलना में कम (अधिक) है जो हीप की रूट के मार्ग पर हैं। अब, मात्र न्यूनतम (अधिकतम) स्तरों पर नोड की जाँच करें।
 * 4) नवीन नोड से रूट तक का पथ (मात्र न्यूनतम (अधिकतम) स्तरों पर विचार करते हुए) अवरोही (आरोही) क्रम में होना चाहिए जैसा कि इन्सर्टेसन से पहले था। इसलिए, हमें इस क्रम में नवीन नोड का बाइनरी इन्सर्टेसन करने की आवश्यकता है। तकनीकी रूप से नवीन नोड को उसके पैरेंट के साथ स्वैप करना सरल है जबकि पैरेंट बड़ा (कम) है।

यह प्रक्रिया नवीन संलग्न कुंजी के सूचकांक पर नीचे वर्णित  एल्गोरिदम को कॉल करके कार्यान्वित की जाती है।

पुश अप
एल्गोरिथ्म (या  जैसा कि इसे कहा जाता है ) इस प्रकार है: function PUSH-UP(h, i): if i is not the root then: if i is on a min level then: if h[i] > h[parent(i)] then: swap h[i] and h[parent(i)]

PUSH-UP-MAX(h, parent(i)) else:

PUSH-UP-MIN(h, i)

endif else:

if h[i] < h[parent(i)] then: swap h[i] and h[parent(i)]

PUSH-UP-MIN(h, parent(i)) else:

PUSH-UP-MAX(h, i) endif endif endif

पुश अप न्यूनतम
function PUSH-UP-MIN(h, i):

if i has a grandparent and h[i] < h[grandparent(i)] then: swap h[i] and h[grandparent(i)]

PUSH-UP-MIN(h, grandparent(i)) endif

अधिकतम पुश अप
ऑपरेशन के जैसे,    के समान है, परन्तु तुलनात्मक ऑपरेटरों के विपरीत: फलन पुश-अप-अधिकतम(एच, आई): यदि i के दादा-दादी हैं और h[i] > h[दादा-दादी(i)] तो: h[i] और h[दादा-दादी(i)] की अदला-बदली करें पुश-अप-अधिकतम(एच, दादा-दादी(i)) यदि अंत

पुनरावृत्त रूप
जैसा कि पुनरावर्ती कॉल करता है  और   पूंछ की स्थिति में हैं, इन कार्यों को निरंतर स्थान में निष्पादित होने वाले विशुद्ध रूप से पुनरावृत्त रूपों में भी परिवर्तित किया जा सकता है: फलन पुश-अप-न्यूनतम-इटर(एच, आई): जबकि i के दादा-दादी हैं और h[i] < h[grandparent(i)] तो: h[i] और h[दादा-दादी(i)] की अदला-बदली करें मैं := दादा-दादी(i) अंत तक

उदाहरण
यहां न्यूनतम-अधिकतम हीप में अवयव डालने का उदाहरण दिया गया है।

मान लें कि हमारे पास निम्नलिखित न्यूनतम-अधिकतम हीप है और हम मान 6 के साथ नवीन नोड सम्मिलित करना चाहते हैं।


 * Min-max heap.jpgप्रारंभ में, नोड 6 को नोड 11 के दाएं बच्चे के रूप में डाला गया है। 6, 11 से कम है, इसलिए यह अधिकतम स्तर (41) पर सभी नोड से कम है, और हमें मात्र न्यूनतम स्तर (8 और 11) की जांच करने की आवश्यकता है )। हमें नोड 6 और 11 को स्वैप करना चाहिए और फिर 6 और 8 को स्वैप करना चाहिए। तो, 6 को हीप की मूल स्थिति में ले जाया जाता है, पूर्व रूट 8 को 11 की जगह लेने के लिए नीचे ले जाया जाता है, और 11 8 का सही बच्चा बन जाता है।

6 के बजाय नवीन नोड 81 जोड़ने पर विचार करें। प्रारंभ में, नोड को नोड 11 के दाहिने बच्चे के रूप में डाला जाता है। 81, 11 से बड़ा है, इसलिए यह किसी भी न्यूनतम स्तर (8 और 11) पर किसी भी नोड से बड़ा है। अब, हमें मात्र अधिकतम स्तर (41) पर नोड की जांच करने और स्वैप करने की आवश्यकता है।

न्यूनतम खोजें
न्यूनतम-अधिकतम हीप का न्यूनतम नोड (या डुप्लिकेट कुंजियों के मामले में न्यूनतम नोड) हमेशा रूट पर स्थित होता है। न्यूनतम खोजें इस प्रकार तुच्छ स्थिर समय ऑपरेशन है जो बस रूटें लौटाता है।

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

न्यूनतम हटाएं
न्यूनतम को हटाना मनमाना नोड को हटाने का विशेष मामला है जिसका सरणी में सूचकांक ज्ञात है। इस स्थिति में, सरणी का अंतिम अवयव हटा दिया जाता है (सरणी की लंबाई कम कर दी जाती है) और सरणी के शीर्ष पर रूट को बदलने के लिए उपयोग किया जाता है।  फिर हीप प्रॉपर्टी को पुनर्स्थापित करने के लिए रूट इंडेक्स पर कॉल किया जाता है $$O(\log_2(n))$$समय।

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

एक्सटेंशन
न्यूनतम-अधिकतम-माध्यिका हीप न्यूनतम-अधिकतम हीप का प्रकार है, जो संरचना पर मूल प्रकाशन में सुझाया गया है, जो आदेश आँकड़ा ट्री के ऑपरेशन का समर्थन करता है।