बाइनरी हीप: Difference between revisions
No edit summary |
No edit summary |
||
| Line 20: | Line 20: | ||
|find_min_worst=O(1)}} | |find_min_worst=O(1)}} | ||
[[File:Max-Heap.svg|thumb|right|संपूर्ण बाइनरी मैक्स-हीप का उदाहरण]] | [[File:Max-Heap.svg|thumb|right|संपूर्ण बाइनरी मैक्स-हीप का उदाहरण]] | ||
[[File:Min-heap.png|thumb|right|संपूर्ण बाइनरी मिन हीप का उदाहरण]]बाइनरी हीप हीप ([[डेटा संरचना]]) डेटा संरचना है जो [[ द्विआधारी वृक्ष |द्विआधारी ट्री]] का रूप लेती है। बाइनरी हीप [[प्राथमिकता कतार|प्राथमिकता पंक्ति]] को लागू करने की सामान्य विधि है।{{r|clrs|pp=162–163}} बाइनरी हीप को 1964 में जे.डब्ल्यू.जे. विलियम्स द्वारा 1964 में | [[File:Min-heap.png|thumb|right|संपूर्ण बाइनरी मिन हीप का उदाहरण]]बाइनरी हीप हीप ([[डेटा संरचना]]) डेटा संरचना है जो [[ द्विआधारी वृक्ष |द्विआधारी ट्री]] का रूप लेती है। बाइनरी हीप [[प्राथमिकता कतार|प्राथमिकता पंक्ति]] को लागू करने की सामान्य विधि है।{{r|clrs|pp=162–163}} बाइनरी हीप को 1964 में जे.डब्ल्यू.जे. विलियम्स द्वारा 1964 में हीपॉर्ट के लिए डेटा संरचना के रूप में प्रस्तुत किया गया था।<ref>{{Citation |first=J. W. J. |last=Williams |author-link=J. W. J. Williams |title=Algorithm 232 - Heapsort |year=1964 |journal=[[Communications of the ACM]] |volume=7 |issue=6 |pages=347–348 |doi= 10.1145/512274.512284}}</ref> | ||
एक बाइनरी हीप को दो अतिरिक्त बाधाओं के साथ बाइनरी ट्री के रूप में परिभाषित किया गया है:<ref>{{citation | author=Y Narahari | title=Data Structures and Algorithms | chapter=Binary Heaps | url=https://gtl.csa.iisc.ac.in/dsa/ | chapter-url=http://lcm.csa.iisc.ernet.in/dsa/node137.html}}</ref> | एक बाइनरी हीप को दो अतिरिक्त बाधाओं के साथ बाइनरी ट्री के रूप में परिभाषित किया गया है:<ref>{{citation | author=Y Narahari | title=Data Structures and Algorithms | chapter=Binary Heaps | url=https://gtl.csa.iisc.ac.in/dsa/ | chapter-url=http://lcm.csa.iisc.ernet.in/dsa/node137.html}}</ref> | ||
*आकार गुण: बाइनरी हीप [[पूरा बाइनरी ट्री|पूर्ण बाइनरी ट्री]] है; अर्थात, संभवतः अंतिम (सबसे गहन) को छोड़कर, ट्री के सभी स्तर पूर्ण रूप से भरे हुए हैं, और, यदि ट्री का अंतिम स्तर पूर्ण नहीं हुआ है, तो उस स्तर के नोड बाएं से दाएं भरे हुए हैं। | *आकार गुण: बाइनरी हीप [[पूरा बाइनरी ट्री|पूर्ण बाइनरी ट्री]] है; अर्थात, संभवतः अंतिम (सबसे गहन) को छोड़कर, ट्री के सभी स्तर पूर्ण रूप से भरे हुए हैं, और, यदि ट्री का अंतिम स्तर पूर्ण नहीं हुआ है, तो उस स्तर के नोड बाएं से दाएं भरे हुए हैं। | ||
| Line 68: | Line 68: | ||
::[[File:Heap remove step2.svg|150px]] | ::[[File:Heap remove step2.svg|150px]] | ||
::नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े बच्चों के साथ स्वैप किया जाता है (मिन-हीप में इसे अपने छोटे बच्चे के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नवीन स्थिति में हीप गुण को संतुष्ट नहीं करता है। यह कार्यक्षमता 'मैक्स-हीपिफाई' फलन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (A) के | ::नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े बच्चों के साथ स्वैप किया जाता है (मिन-हीप में इसे अपने छोटे बच्चे के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नवीन स्थिति में हीप गुण को संतुष्ट नहीं करता है। यह कार्यक्षमता 'मैक्स-हीपिफाई' फलन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (A) के सरणी डेटा संरचना-समर्थित हीप A के लिए छद्म कोड में नीचे परिभाषित किया गया है। A को 1 से प्रारम्भ करके अनुक्रमित किया गया है। | ||
// Perform a down-heap or heapify-down operation for a max-heap | // Perform a down-heap or heapify-down operation for a max-heap | ||
| Line 133: | Line 133: | ||
किसी यादृच्छिक अवयव को हटाना इस प्रकार किया जा सकता है: | किसी यादृच्छिक अवयव को हटाना इस प्रकार किया जा सकता है: | ||
# जिस | # जिस अवयव को हम हटाना चाहते हैं उसका सूचकांक <math>i</math> ढूंढें। | ||
# इस अवयव को अंतिम अवयव से बदलें। | # इस अवयव को अंतिम अवयव से बदलें। | ||
# हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई या ऊपरहीपिफाई करें। अधिकतम-हीप (न्यूनतम-हीप) में, ऊपरहीपिफ़ाइ की आवश्यकता मात्र तब होती है जब <math>i</math> अवयव की नवीन कुंजी होती है पूर्व वाले से बड़ा (छोटा) है क्योंकि मात्र मूल अवयव की हीप-गुण का उल्लंघन हो सकता है। यह मानते हुए कि हीप-गुण अवयव <math>i</math> के बीच मान्य थी और अवयव स्वैप से पहले उसके बच्चे, अब बड़े (छोटे) कुंजी मान द्वारा इसका उल्लंघन नहीं किया जा सकता है। जब नवीन कुंजी पूर्व कुंजी से कम (अधिक) होती है तो मात्र निम्न-हीपिफाई की आवश्यकता होती है क्योंकि हीप-गुण का उल्लंघन मात्र बच्चों अवयवों में ही हो सकता है। | # हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई या ऊपरहीपिफाई करें। अधिकतम-हीप (न्यूनतम-हीप) में, ऊपरहीपिफ़ाइ की आवश्यकता मात्र तब होती है जब <math>i</math> अवयव की नवीन कुंजी होती है पूर्व वाले से बड़ा (छोटा) है क्योंकि मात्र मूल अवयव की हीप-गुण का उल्लंघन हो सकता है। यह मानते हुए कि हीप-गुण अवयव <math>i</math> के बीच मान्य थी और अवयव स्वैप से पहले उसके बच्चे, अब बड़े (छोटे) कुंजी मान द्वारा इसका उल्लंघन नहीं किया जा सकता है। जब नवीन कुंजी पूर्व कुंजी से कम (अधिक) होती है तो मात्र निम्न-हीपिफाई की आवश्यकता होती है क्योंकि हीप-गुण का उल्लंघन मात्र बच्चों अवयवों में ही हो सकता है। | ||
| Line 150: | Line 150: | ||
# उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं। | # उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं। | ||
# नोड का मान बढ़ाएँ। | # नोड का मान बढ़ाएँ। | ||
# हीप गुण को पुनर्स्थापित करने के लिए ऊपर- | # हीप गुण को पुनर्स्थापित करने के लिए ऊपर-हीपिफाइ (अधिकतम हीप मानकर)। | ||
==हीप बनाना== | ==हीप बनाना== | ||
एन इनपुट | एन इनपुट अवयवों की एक सरणी से एक हीप का निर्माण एक रिक्त हीप से प्रारम्भ करके, फिर क्रमिक रूप से प्रत्येक अवयव को सम्मिलित करके किया जा सकता है। यह दृष्टिकोण, जिसे बाइनरी हीप के आविष्कारक के नाम पर विलियम्स विधि कहा जाता है, सरलता से '''O(n log n)''' समय में चलता हुआ देखा जाता है: यह प्रत्येक '''O(log n)''' लागत पर n निवेशन करता है।{{efn|In fact, this procedure can be shown to take {{math|Θ(''n'' log ''n'')}} time [[Best, worst and average case|in the worst case]], meaning that {{math|''n'' log ''n''}} is also an asymptotic lower bound on the complexity.<ref name="clrs">{{Introduction to Algorithms|3}}</ref>{{rp|167}} In the ''average case'' (averaging over all [[permutation]]s of {{mvar|n}} inputs), though, the method takes linear time.<ref name="heapbuildjalg">{{cite journal |title=Average Case Analysis of Heap Building by Repeated Insertion |first1=Ryan |last1=Hayward |first2=Colin |last2=McDiarmid |journal=J. Algorithms |year=1991 |volume=12 |pages=126–153 |url=http://www.stats.ox.ac.uk/__data/assets/pdf_file/0015/4173/heapbuildjalg.pdf |doi=10.1016/0196-6774(91)90027-v |citeseerx=10.1.1.353.7888 |access-date=2016-01-28 |archive-url=https://web.archive.org/web/20160205023201/http://www.stats.ox.ac.uk/__data/assets/pdf_file/0015/4173/heapbuildjalg.pdf |archive-date=2016-02-05 }}</ref>}} | ||
यद्यपि, विलियम्स की विधि इष्टतम नहीं है। तीव्र विधि (रॉबर्ट डब्ल्यू फ़्लॉइड के कारण{{r|heapbuildjalg}}) आकृति गुण का सम्मान करते हुए यादृच्छिक रूप से अवयवों को बाइनरी ट्री पर रखकर प्रारम्भ होता है (ट्री को सरणी द्वारा दर्शाया जा सकता है, नीचे देखें)। फिर सबसे निम्न स्तर से प्रारम्भ करके ऊपर की ओर बढ़ते हुए, प्रत्येक उपट्री की रूट को विलोपन एल्गोरिदम के अनुसार नीचे की ओर तब तक | यद्यपि, विलियम्स की विधि इष्टतम नहीं है। तीव्र विधि (रॉबर्ट डब्ल्यू फ़्लॉइड के कारण{{r|heapbuildjalg}}) आकृति गुण का सम्मान करते हुए यादृच्छिक रूप से अवयवों को बाइनरी ट्री पर रखकर प्रारम्भ होता है (ट्री को सरणी द्वारा दर्शाया जा सकता है, नीचे देखें)। फिर सबसे निम्न स्तर से प्रारम्भ करके ऊपर की ओर बढ़ते हुए, प्रत्येक उपट्री की रूट को विलोपन एल्गोरिदम के अनुसार नीचे की ओर तब तक जांचे जब तक कि हीप गुण पुनः स्थापित न हो जाए। अधिक विशेष रूप से यदि कुछ ऊंचाई <math>h</math> से प्रारम्भ होने वाले सभी उपट्री पहले से ही हेपीफाईड (सबसे निम्न स्तर <math>h=0</math> के अनुरूप), ऊंचाई <math>h+1</math> पर ट्री अधिकतम-हीप बनाते समय, या न्यूनतम-हीप बनाते समय न्यूनतम मानित बच्चों के पथ पर उनकी रूटों को नीचे भेजकर हीप किया जा सकता है। इस प्रक्रिया में <math>O(h)</math> प्रति नोड संचालन (स्वैप) लगता है । इस विधि में अधिकांश हीपिफाइ निम्न स्तरों पर होता है। चूंकि हीप की ऊंचाई <math> \lfloor \log n \rfloor</math> है, <math>h</math> ऊंचाई पर नोड की संख्या <math>\le \frac{2^{\lfloor \log n \rfloor}}{2^h} \le \frac{n}{2^h}</math> है । इसलिए, सभी उपट्री को हीप करने की लागत है: | ||
:<math> | :<math> | ||
| Line 165: | Line 165: | ||
\end{align} | \end{align} | ||
</math> | </math> | ||
यह इस तथ्य का उपयोग करता है कि दी गई अनंत [[श्रृंखला (गणित)]] <math display="inline">\sum_{i=0}^\infty i/2^i</math> [[अभिसरण श्रृंखला]] | यह इस तथ्य का उपयोग करता है कि दी गई अनंत [[श्रृंखला (गणित)]] <math display="inline">\sum_{i=0}^\infty i/2^i</math> [[अभिसरण श्रृंखला]] है। | ||
उपरोक्त का | उपरोक्त का यथार्थ मान (हीप निर्माण के समय तुलना की सबसे निकृष्ट स्थिति वाली संख्या) इसके बराबर माना जाता है: | ||
:<math> 2 n - 2 s_2 (n) - e_2 (n) </math>,<ref>{{citation | :<math> 2 n - 2 s_2 (n) - e_2 (n) </math>,<ref>{{citation | ||
| Line 179: | Line 179: | ||
| year = 2012 | | year = 2012 | ||
| url = http://www.deepdyve.com/lp/ios-press/elementary-yet-precise-worst-case-analysis-of-floyd-s-heap-50NW30HMxU}}.</ref>{{efn|This does not mean that ''sorting'' can be done in linear time since building a heap is only the first step of the [[heapsort]] algorithm.}} | | url = http://www.deepdyve.com/lp/ios-press/elementary-yet-precise-worst-case-analysis-of-floyd-s-heap-50NW30HMxU}}.</ref>{{efn|This does not mean that ''sorting'' can be done in linear time since building a heap is only the first step of the [[heapsort]] algorithm.}} | ||
जहाँ {{math|''s''<sub>2</sub>(''n'')}} [[हथौड़ा चलाना वजन|बाइनरी प्रतिनिधित्व के सभी अंकों का योग]] {{mvar|n}} है और {{math|''e''<sub>2</sub>(''n'')}} का प्रतिपादक {{math|2}} है, जो {{mvar|n}} के अभाज्य गुणनखंडन में है । | |||
औसत स्थिति का विश्लेषण करना अधिक जटिल है, परन्तु इसे स्पर्शोन्मुख दृष्टिकोण | औसत स्थिति का विश्लेषण करना अधिक जटिल है, परन्तु इसे स्पर्शोन्मुख दृष्टिकोण {{math|1.8814 ''n'' − 2 log<sub>2</sub>''n'' + ''O''(1)}} तुलना से दिखाया जा सकता है।<ref>{{cite journal |title=ढेर बनाने के लिए फ़्लॉइड के एल्गोरिथम का एक औसत केस विश्लेषण|first=Ernst E. |last=Doberkat |journal=Information and Control |volume=6 |issue=2 |pages=114–131 |date=May 1984 |doi=10.1016/S0019-9958(84)80053-4 |url=https://core.ac.uk/download/pdf/82135122.pdf |doi-access=free}}</ref><ref>{{cite techreport | ||
|title=Elementary Average Case Analysis of Floyd's Algorithm to Construct Heaps | |title=Elementary Average Case Analysis of Floyd's Algorithm to Construct Heaps | ||
|first=Tomi |last=Pasanen | |first=Tomi |last=Pasanen | ||
| Line 190: | Line 190: | ||
|citeseerx=10.1.1.15.9526 | |citeseerx=10.1.1.15.9526 | ||
}} Note that this paper uses Floyd's original terminology "siftup" for what is now called sifting ''down''.</ref> | }} Note that this paper uses Floyd's original terminology "siftup" for what is now called sifting ''down''.</ref> | ||
'बिल्ड-मैक्स-हीप' ( | इसके बाद आने वाला बिल्ड-मैक्स-हीप फ़ंक्शन, एक सरणी A को परिवर्तित करता है जो बार-बार अधिकतम-हीपिफ़ाई (अधिकतम-हीप के लिए निम्न-हीपिफ़ाई) का उपयोग करके उपरी विधि से एन नोड के साथ एक पूर्ण बाइनरी ट्री को अधिकतम-हीप में संग्रहीत करता है। {{nowrap|''[[floor function|floor]]''(''n''/2) + 1}}, {{nowrap|''floor''(''n''/2) + 2}}, ..., एन र (एन/2) + 2, ..., एन द्वारा अनुक्रमित सरणी अवयव ट्री के सभी पत्र हैं (यह मानते हुए कि सूचकांक 1 से प्रारम्भ होते हैं) - इस प्रकार प्रत्येक एक-अवयव का हीप है, और इसे नीचे-हीप करने की आवश्यकता नहीं है। बिल्ड-मैक्स-हीप शेष प्रत्येक ट्री नोड पर मैक्स-हीपिफाई चलाता है। | ||
' | |||
' | '''Build-Max-Heap''' (''A''): | ||
'''for each''' index ''i'' '''from''' ''floor''(''length''(''A'')/2) '''downto''' 1 '''do:''' | |||
'''Max-Heapify'''(''A'', ''i'') | |||
== हीप कार्यान्वयन == | == हीप कार्यान्वयन == | ||
[[File:Binary tree in array.svg|right|frame|एक सरणी में संग्रहीत छोटा पूर्ण बाइनरी ट्री]] | [[File:Binary tree in array.svg|right|frame|एक सरणी में संग्रहीत छोटा पूर्ण बाइनरी ट्री]] | ||
[[File:Binary Heap with Array Implementation.JPG|400px|thumb|right|बाइनरी हीप और सरणी कार्यान्वयन के बीच तुलना।]]हीप को सामान्यतः | [[File:Binary Heap with Array Implementation.JPG|400px|thumb|right|बाइनरी हीप और सरणी कार्यान्वयन के बीच तुलना।]]हीप को सामान्यतः सरणी डेटा संरचना के साथ कार्यान्वित किया जाता है। किसी भी बाइनरी ट्री को सरणी में संग्रहीत किया जा सकता है, परन्तु क्योंकि बाइनरी हीप सदैव पूर्ण बाइनरी ट्री होता है, इसे संहत रूप से संग्रहीत किया जा सकता है। [[ सूचक (कंप्यूटर प्रोग्रामिंग) |सूचक (कंप्यूटर प्रोग्रामिंग)]] के लिए किसी स्थान की आवश्यकता नहीं है; इसके अतिरिक्त, प्रत्येक नोड के माता-पिता और बच्चों को सरणी सूचकांकों पर अंकगणित द्वारा पाया जा सकता है। ये गुण इस हीप कार्यान्वयन को अंतर्निहित डेटा संरचना या [[वंशावली]] सूची का सरल उदाहरण बनाते हैं। विवरण मूल स्थिति पर निर्भर करते हैं, जो इसके स्थान पर कार्यान्वयन के लिए उपयोग की जाने वाली [[प्रोग्रामिंग भाषा]] की बाधाओं या प्रोग्रामर की प्राथमिकता पर निर्भर हो सकते हैं। विशेष रूप से, कभी-कभी अंकगणित को सरल बनाने के लिए मूल को सूचकांक 1 पर रखा जाता है। | ||
मान लीजिए n हीप में अवयवों की संख्या है और i हीप को संग्रहीत करने वाले सरणी का यादृच्छिक वैध सूचकांक है। यदि ट्री की रूट सूचकांक 0 पर है, वैध सूचकांक 0 से एन - 1 के साथ, तो सूचकांक i पर प्रत्येक अवयव a है | मान लीजिए n हीप में अवयवों की संख्या है और i हीप को संग्रहीत करने वाले सरणी का यादृच्छिक वैध सूचकांक है। यदि ट्री की रूट सूचकांक 0 पर है, वैध सूचकांक 0 से एन - 1 के साथ, तो सूचकांक i पर प्रत्येक अवयव a है | ||
* सूचकांक 2i + 1 और 2i + 2 पर बच्चे | * सूचकांक 2i + 1 और 2i + 2 पर बच्चे | ||
* | * सूचकांक [[फर्श समारोह|फलक]] फलन पर इसका मूल ((i - 1) / 2)। | ||
वैकल्पिक रूप से, यदि ट्री की रूट सूचकांक 1 पर है, वैध सूचकांक 1 से एन के साथ, तो सूचकांक i पर प्रत्येक अवयव a है | वैकल्पिक रूप से, यदि ट्री की रूट सूचकांक 1 पर है, वैध सूचकांक 1 से एन के साथ, तो सूचकांक i पर प्रत्येक अवयव a है | ||
*सूचकांक 2i और 2i +1 पर बच्चे | *सूचकांक 2i और 2i +1 पर बच्चे | ||
* | * सूचकांक [[फर्श समारोह|फलक]] फलन (i/2) पर इसका मूल। | ||
इस कार्यान्वयन का उपयोग हीप सॉर्ट एल्गोरिदम में किया जाता है जो हीप को संग्रहीत करने के लिए इनपुट सरणी को आवंटित स्थान का पुन: उपयोग करता है (अर्थात एल्गोरिदम [[इन-प्लेस एल्गोरिदम]] किया जाता है)। यह कार्यान्वयन प्राथमिकता पंक्ति के रूप में भी उपयोगी है। जब [[गतिशील सरणी]] का उपयोग किया जाता है, तो असीमित संख्या में वस्तुों का क्षेपण संभव है। | |||
<code>upheap</code> या <code>downheap</code> संचालन को सरणी के संदर्भ में निम्नानुसार बताया जा सकता है: मान लीजिए कि हीप गुण सूचकांक '''''b, b + 1, ..., e''''' के लिए है। सिफ्ट-निम्न फलन हीप गुण को '''''b−1, b, b+1, ..., e''''' तक बढ़ाता है। मात्र सूचकांक '''i = b−1''' हीप गुण का उल्लंघन कर सकता है। | |||
मात्र सूचकांक i = b−1 हीप गुण का उल्लंघन कर सकता है। | |||
मान लें कि j श्रेणी b, ..., e के भीतर a[i] (अधिकतम-हीप के लिए, या न्यूनतम-हीप के लिए सबसे छोटे बच्चे) के सबसे बड़े बच्चे का सूचकांक है। | मान लें कि '''j''' श्रेणी '''b, ..., e''' के भीतर '''a[i]''' (अधिकतम-हीप के लिए, या न्यूनतम-हीप के लिए सबसे छोटे बच्चे) के सबसे बड़े बच्चे का सूचकांक है। (यदि ऐसा कोई सूचकांक स्थित नहीं है क्योंकि '''{{nowrap|2''i'' > ''e''}}''' तो हीप गुण नवीन विस्तारित सीमा के लिए बनी रहती है और कुछ भी करने की आवश्यकता नहीं होती है।) '''a[i]''' और '''a[j]''' मानों की गमागमन करके स्थिति i के लिए हीप गुण स्थापित की जाती है। इस बिंदु पर, एकमात्र समस्या यह है कि हीप गुण सूचकांक '''j''' के लिए मान्य नहीं हो सकती है।सिफ्ट-निम्न फलन को [[ पूँछ प्रत्यावर्तन |पश्च प्रत्यावर्तन]] |टेल-रिकर्सिव रूप से सूचकांक '''j''' पर तब तक लागू किया जाता है जब तक कि सभी अवयवों के लिए हीप गुण स्थापित नहीं हो जाती है। | ||
(यदि ऐसा कोई सूचकांक | |||
a[i] और a[j] मानों की गमागमन करके स्थिति i के लिए हीप गुण स्थापित की जाती है। | |||
इस बिंदु पर, एकमात्र समस्या यह है कि हीप गुण सूचकांक | |||
सिफ्ट-निम्न फलन तीव्र है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह काम कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम लॉग में<sub>2</sub> ई कदम आवश्यक हैं। | सिफ्ट-निम्न फलन तीव्र है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह काम कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम लॉग में<sub>2</sub> ई कदम आवश्यक हैं। | ||
| Line 230: | Line 224: | ||
[https://doi.org/10.1007%2FBF00264229 "An Algorithm for Merging Heaps"], | [https://doi.org/10.1007%2FBF00264229 "An Algorithm for Merging Heaps"], | ||
Acta Informatica 22, 171-186 (1985).</ref> नवीन दृश्य के आधार पर, n अवयवों पर हीप को क्रमशः k और n-k अवयवों पर दो ढेरों में विभाजित करने के लिए एल्गोरिदम | Acta Informatica 22, 171-186 (1985).</ref> नवीन दृश्य के आधार पर, n अवयवों पर हीप को क्रमशः k और n-k अवयवों पर दो ढेरों में विभाजित करने के लिए एल्गोरिदम | ||
उप-ढेरों के क्रमबद्ध संग्रह के रूप में ढेरों को प्रस्तुत किया गया था।<ref>{{Cite journal |doi = 10.1016/0890-5401(90)90026-E|title = ढेर और उसके अनुप्रयोगों का एक लक्षण वर्णन|journal = Information and Computation|volume = 86|pages = 69–86|year = 1990|last1 = Sack|first1 = Jörg-Rüdiger| last2 = Strothotte|first2 = Thomas|doi-access = free}}</ref> एल्गोरिथम को O(log n * log n) तुलना की आवश्यकता होती है। यह दृश्य ढेरों के विलय के लिए नवीन और वैचारिक रूप से सरल एल्गोरिदम भी प्रस्तुत करता है। जब विलय सामान्य कार्य है, तो अलग हीप कार्यान्वयन की सिफारिश की जाती है, जैसे [[द्विपद ढेर]], जिसे ओ (लॉग एन) में विलय किया जा सकता है। | उप-ढेरों के क्रमबद्ध संग्रह के रूप में ढेरों को प्रस्तुत किया गया था।<ref>{{Cite journal |doi = 10.1016/0890-5401(90)90026-E|title = ढेर और उसके अनुप्रयोगों का एक लक्षण वर्णन|journal = Information and Computation|volume = 86|pages = 69–86|year = 1990|last1 = Sack|first1 = Jörg-Rüdiger| last2 = Strothotte|first2 = Thomas|doi-access = free}}</ref> एल्गोरिथम को O(log n * log n) तुलना की आवश्यकता होती है। यह दृश्य ढेरों के विलय के लिए नवीन और वैचारिक रूप से सरल एल्गोरिदम भी प्रस्तुत करता है। जब विलय सामान्य कार्य है, तो अलग हीप कार्यान्वयन की सिफारिश की जाती है, जैसे [[द्विपद ढेर|द्विपद]] हीप, जिसे ओ (लॉग एन) में विलय किया जा सकता है। | ||
इसके अतिरिक्त, बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, परन्तु अवयव जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न अवयव को खोजने में समस्या होती है। इस अवयव को एल्गोरिदमिक रूप से या नोड में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - मात्र बच्चों के संदर्भों को संग्रहीत करने के अतिरिक्त, हम नोड के [[क्रम में]] उत्तराधिकारी को भी संग्रहीत करते हैं। | इसके अतिरिक्त, बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, परन्तु अवयव जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न अवयव को खोजने में समस्या होती है। इस अवयव को एल्गोरिदमिक रूप से या नोड में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - मात्र बच्चों के संदर्भों को संग्रहीत करने के अतिरिक्त, हम नोड के [[क्रम में]] उत्तराधिकारी को भी संग्रहीत करते हैं। | ||
| Line 256: | Line 250: | ||
सूचकांक पर स्थित सामान्य नोड के लिए {{mvar|i}} (0 से प्रारम्भ करके), हम पहले इसके उचित बच्चे का सूचकांक प्राप्त करेंगे, <math>\text{right} = 2i + 2</math>। | सूचकांक पर स्थित सामान्य नोड के लिए {{mvar|i}} (0 से प्रारम्भ करके), हम पहले इसके उचित बच्चे का सूचकांक प्राप्त करेंगे, <math>\text{right} = 2i + 2</math>। | ||
चलो नोड {{mvar|i}} स्तर पर स्थित हो {{mvar|L}}, और ध्यान दें कि कोई भी स्तर {{mvar|l}} बिल्कुल सम्मिलित है <math>2^l</math> नोड। इसके अतिरिक्त, बिल्कुल हैं <math>2^{l + 1} - 1</math> परतों तक और परत सहित परतों में निहित नोड {{mvar|l}} (बाइनरी अंकगणित के बारे में सोचें; 0111...111 = 1000...000 - 1)। क्योंकि रूट 0 पर संग्रहित है {{mvar|k}}वें नोड को | चलो नोड {{mvar|i}} स्तर पर स्थित हो {{mvar|L}}, और ध्यान दें कि कोई भी स्तर {{mvar|l}} बिल्कुल सम्मिलित है <math>2^l</math> नोड। इसके अतिरिक्त, बिल्कुल हैं <math>2^{l + 1} - 1</math> परतों तक और परत सहित परतों में निहित नोड {{mvar|l}} (बाइनरी अंकगणित के बारे में सोचें; 0111...111 = 1000...000 - 1)। क्योंकि रूट 0 पर संग्रहित है {{mvar|k}}वें नोड को सूचकांक पर संग्रहीत किया जाएगा <math>(k - 1)</math>। इन अवलोकनों को साथ रखने पर परत में अंतिम नोड के सूचकांक के लिए निम्नलिखित अभिव्यक्ति प्राप्त होती है {{mvar|l}}। | ||
::<math>\text{last}(l) = (2^{l + 1} - 1) - 1 = 2^{l + 1} - 2</math> | ::<math>\text{last}(l) = (2^{l + 1} - 1) - 1 = 2^{l + 1} - 2</math> | ||
| Line 277: | Line 271: | ||
आवश्यकता अनुसार। | आवश्यकता अनुसार। | ||
यह देखते हुए कि किसी भी नोड का बायां बच्चा | यह देखते हुए कि किसी भी नोड का बायां बच्चा सदैव उसके दाएं बच्चे से 1 स्थान पहले होता है, हमें मिलता है <math>\text{left} = 2i + 1</math>। | ||
यदि रूट 0 के अतिरिक्त | यदि रूट 0 के अतिरिक्त सूचकांक 1 पर स्थित है, तो प्रत्येक स्तर में अंतिम नोड सूचकांक पर है <math>2^{l + 1} - 1</math>। इसका प्रयोग सम्पूर्ण पैदावार में करें <math>\text{left} = 2i</math> और <math>\text{right} = 2i + 1</math> उन ढेरों के लिए जिनकी रूट 1 है। | ||
=== मूल नोड === | === मूल नोड === | ||
Revision as of 09:28, 18 July 2023
| Binary (min) heap | |||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Type | binary tree/heap | ||||||||||||||||||
| Invented | 1964 | ||||||||||||||||||
| Invented by | J. W. J. Williams | ||||||||||||||||||
| Time complexity in big O notation | |||||||||||||||||||
| |||||||||||||||||||
बाइनरी हीप हीप (डेटा संरचना) डेटा संरचना है जो द्विआधारी ट्री का रूप लेती है। बाइनरी हीप प्राथमिकता पंक्ति को लागू करने की सामान्य विधि है।[1]: 162–163 बाइनरी हीप को 1964 में जे.डब्ल्यू.जे. विलियम्स द्वारा 1964 में हीपॉर्ट के लिए डेटा संरचना के रूप में प्रस्तुत किया गया था।[2]
एक बाइनरी हीप को दो अतिरिक्त बाधाओं के साथ बाइनरी ट्री के रूप में परिभाषित किया गया है:[3]
- आकार गुण: बाइनरी हीप पूर्ण बाइनरी ट्री है; अर्थात, संभवतः अंतिम (सबसे गहन) को छोड़कर, ट्री के सभी स्तर पूर्ण रूप से भरे हुए हैं, और, यदि ट्री का अंतिम स्तर पूर्ण नहीं हुआ है, तो उस स्तर के नोड बाएं से दाएं भरे हुए हैं।
- हीप गुण: कुछ कुल क्रम के अनुसार, प्रत्येक नोड में संग्रहीत कुंजी या तो (≥) से अधिक या उसके बराबर है या नोड के बच्चों में कुंजी से कम या (≤) के बराबर है।
वे हीप जहां मूल कुंजी बच्चों कुंजी (≥) से अधिक या उसके बराबर होती है, मैक्स-हीप कहलाती है; वे जहां यह (≤) से कम या बराबर है उन्हें मिन-हीप कहा जाता है। कुशल (लघुगणक समय) एल्गोरिदम को बाइनरी हीप पर प्राथमिकता पंक्ति को लागू करने के लिए आवश्यक दो परिचालनों के लिए जाना जाता है: अवयव डालना, और क्रमशः न्यूनतम-हीप या अधिकतम-हीप से सबसे छोटे या सबसे बड़े अवयव को हटाना। बाइनरी हीप को सामान्यतः हीप सॉर्ट सोर्टिंग एल्गोरिदम में भी नियोजित किया जाता है, जो इन-प्लेस एल्गोरिदम है क्योंकि बाइनरी हीप को अंतर्निहित डेटा संरचना के रूप में कार्यान्वित किया जा सकता है, सरणी में कुंजी संग्रहीत करना और बच्चे-अभिभावक संबंधों का प्रतिनिधित्व करने के लिए उस सरणी के भीतर उनके सापेक्ष पदों का उपयोग करना।
हीप परिचालन
सम्मिलित करने और हटाने के दोनों परिचालन पहले हीप के अंत से जोड़कर या हटाकर, आकार गुण के अनुरूप हीप को संशोधित करते हैं। फिर हीप की गुण को हीप के ऊपर या नीचे जाकर पुनः स्थापित किया जाता है। दोनों परिचालन में O(log n) समय लगता है।
निवेशन
हीप में अवयव जोड़ने के लिए, हम यह एल्गोरिदम निष्पादित कर सकते हैं:
- अवयव को सबसे बाईं ओर संवृत स्थान पर हीप के निम्न स्तर पर जोड़ें।
- जोड़े गए अवयव की उसके मूल अवयव से तुलना करें; यदि वे उचित क्रम में हैं, तो रुकें।
- यदि नहीं, तो अवयव को उसके मूल अवयव से बदलें और पूर्व चरण पर वापस लौटें।
चरण 2 और 3, जो नोड की उसके मूल के साथ तुलना और संभवतः गमागमन करके हीप गुण को पुनः स्थापित करते हैं, ऊपरहीप परिचालन कहलाते हैं (बबल-अप, परकोलेट-अप, सिफ्ट-अप, ट्रिकल-अप, स्विम-अप, हेपिफाई-अप या कैस्केड-अप के रूप में भी जाना जाता है)।
आवश्यक संचालन की संख्या मात्र उन स्तरों की संख्या पर निर्भर करती है जो नवीन अवयव को हीप गुण को संतुष्ट करने के लिए बढ़ाना चाहिए। इस प्रकार, क्षेपण परिचालन में O(log n) की सबसे निकृष्ट स्थिति वाली समय जटिलता होती है । यादृच्छिक हीप के लिए, और बार-बार क्षेपण के लिए, क्षेपण परिचालन में O(1) की औसत-केस जटिलता होती है।[4][5]
बाइनरी हीप क्षेपण के उदाहरण के रूप में, मान लें कि हमारे गुण अधिकतम-हीप
- File:Heap add step1.svg
- है और हम हीप में संख्या 15 जोड़ना चाहते हैं। हम पहले 15 को एक्स द्वारा चिह्नित स्थान पर रखते हैं। यद्यपि, हीप गुण का उल्लंघन 15 > 8 से हुआ है, इसलिए हमें 15 और 8 को स्वैप करने की आवश्यकता है। इसलिए, पहले स्वैप के बाद हमारे गुण हीप इस प्रकार दिख रहा है:
- File:Heap add step2.svg
- यद्यपि हीप गुण का अभी भी उल्लंघन किया जा रहा है 15 > 11, इसलिए हमें फिर से स्वैप करने की आवश्यकता है:
- File:Heap add step3.svg
- जो वैध अधिकतम-हीप है। इस अंतिम चरण के बाद बाएं बच्चे की जांच करने की कोई आवश्यकता नहीं है: प्रारम्भ में, अधिकतम-हीप वैध था, जिसका अर्थ है कि रूट पहले से ही अपने बाएं बच्चे से बड़ा था, इसलिए रूट को और भी अधिक मान के साथ बदलने से वह गुण बनी रहेगी प्रत्येक नोड अपने बच्चों से बड़ा है (11 > 5; यदि 15 > 11, और 11 > 5, तो सकर्मक संबंध के कारण 15 > 5, )।
निष्कर्षण
हीप गुण को बनाए रखते हुए हीप से रूट को हटाने की प्रक्रिया (अधिकतम-हीप में अधिकतम अवयव या न्यूनतम-हीप में न्यूनतम अवयव को प्रभावी रूप से निकालना) इस प्रकार है:
- हीप की रूट को अंतिम स्तर पर अंतिम अवयव से बदलें।
- नवीन रूट की तुलना उसके बच्चों से करें; यदि वे उचित क्रम में हैं, तो रुकें।
- यदि नहीं, तो अवयव को उसके किसी बच्चे के साथ बदलें और पूर्व चरण पर वापस लौटें। (मिन-हीप में इसके छोटे बच्चे और उच्च-हीप में इसके बड़े बच्चे के साथ स्वैप करें।)
चरण 2 और 3, जो एक नोड की उसके बच्चों में से किसी एक के साथ तुलना करके और संभवतः स्वैप करके हीप संपत्ति को पुनर्स्थापित करते हैं, निम्न-हीप (बबल-निम्न, परकोलेट-निम्न, सिफ्ट-निम्न, सिंक-निम्न, ट्रिकल निम्न, हेपिफाई-निम्न, कैस्केड-निम्न, निष्कर्षण-मिन या एक्सट्रैक्ट-मैक्स, या बस हेपिफाई के रूप में भी जाना जाता है) परिचालन कहलाते हैं।
इसलिए, यदि हमारे गुण पहले जैसा ही अधिकतम-हीप है
- File:Heap delete step0.svg
- हम 11 को हटाते हैं और इसे 4 से प्रतिस्थापित करते हैं।
- File:Heap remove step1.svg
- अब हीप गुण का उल्लंघन हो गया है क्योंकि 8, 4 से बड़ा है। इस स्थिति में, दो अवयवों, 4 और 8 की गमागमन, हीप गुण को पुनः स्थापित करने के लिए पर्याप्त है और हमें आगे अवयवों की गमागमन करने की आवश्यकता नहीं है:
- File:Heap remove step2.svg
- नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े बच्चों के साथ स्वैप किया जाता है (मिन-हीप में इसे अपने छोटे बच्चे के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नवीन स्थिति में हीप गुण को संतुष्ट नहीं करता है। यह कार्यक्षमता 'मैक्स-हीपिफाई' फलन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (A) के सरणी डेटा संरचना-समर्थित हीप A के लिए छद्म कोड में नीचे परिभाषित किया गया है। A को 1 से प्रारम्भ करके अनुक्रमित किया गया है।
// Perform a down-heap or heapify-down operation for a max-heap // A: an array representing the heap, indexed starting at 1 // i: the index to start at when heapifying down
Max-Heapify(A, i):
left ← 2×i
right ← 2×i + 1
largest ← i
if left ≤ length(A) and A[left] > A[largest] then:
largest ← left
if right ≤ length(A) and A[right] > A[largest] then:
largest ← right
if largest ≠ i then:
swap A[i] and A[largest]
Max-Heapify(A, largest)
उपरोक्त एल्गोरिदम के लिए सरणी को उचित रूप से पुन: हीप करने के लिए, सूचकांक i और उसके दो प्रत्यक्ष बच्चों के नोड के अतिरिक्त कोई भी नोड हीप गुण का उल्लंघन नहीं कर सकता है। निम्न-हीप परिचालन (पूर्ववर्ती स्वैप के बिना) का उपयोग रूट के मान को संशोधित करने के लिए भी किया जा सकता है, तब भी जब कोई अवयव हटाया नहीं जा रहा हो।
सबसे निकृष्ट स्थिति में, नवीन रूट को प्रत्येक स्तर पर अपने बच्चे के साथ तब तक स्वैप करना पड़ता है जब तक कि यह हीप के निम्न स्तर तक नहीं पहुंच जाता है, जिसका अर्थ है कि डिलीट परिचालन में ट्री की ऊंचाई के सापेक्ष समय जटिलता है, या O(log n)।
निवेशन फिर निष्कर्षण
किसी अवयव को सम्मिलित करना और फिर हीप से निकालना ऊपर परिभाषित निवेशन और निष्कर्षण संक्रिया को कॉल करने की तुलना में अधिक कुशलता से किया जा सकता है, जिसमें दोनों upheap और downheap संक्रिया सम्मिलित होंगे। इसके अतिरिक्त, हम मात्र downheap परिचालन कर सकते हैं , इस प्रकार है:
- तुलना करें कि क्या हम जिस वस्तु को आगे बढ़ा रहे हैं या हीप के शीर्ष पर झांक रहा है वह बड़ा है (अधिकतम हीप मानते हुए)
- यदि हीप की रूट बड़ी हो:
- रूट को नवीन वस्तु से बदलें
- रूट से प्रारम्भ करके निम्न-हीपिफाई करना
- अन्यथा, वह वस्तु वापस कर दें जिसे हम आगे बढ़ा रहे हैं
पायथन (प्रोग्रामिंग भाषा) क्षेपण और फिर निष्कर्षण के लिए हीपपुशपॉप नामक ऐसा फलन प्रदान करता है, जिसे नीचे संक्षेप में प्रस्तुत किया गया है।[6][7] माना जाता है कि हीप सरणी का पहला अवयव सूचकांक 1 पर है।
// Push a new item to a (max) heap and then extract the root of the resulting heap. // heap: an array representing the heap, indexed at 1 // item: an element to insert // Returns the greater of the two between item and the root of heap.
Push-Pop(heap: List<T>, item: T) -> T:
if heap is not empty and heap[1] > item then: // < if min heap
swap heap[1] and item
_downheap(heap starting from index 1)
return item
एक समान फलन को पॉपिंग और फिर डालने के लिए परिभाषित किया जा सकता है, जिसे पायथन में हीपप्रीप्लेस कहा जाता है:
// Extract the root of the heap, and push a new item // heap: an array representing the heap, indexed at 1 // item: an element to insert // Returns the current root of heap
swap heap[1] and item
_downheap(heap starting from index 1)
return item
सर्च
एक यादृच्छिक अवयव ढूँढने में O(n) समय लगता है।
विलोप
किसी यादृच्छिक अवयव को हटाना इस प्रकार किया जा सकता है:
- जिस अवयव को हम हटाना चाहते हैं उसका सूचकांक ढूंढें।
- इस अवयव को अंतिम अवयव से बदलें।
- हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई या ऊपरहीपिफाई करें। अधिकतम-हीप (न्यूनतम-हीप) में, ऊपरहीपिफ़ाइ की आवश्यकता मात्र तब होती है जब अवयव की नवीन कुंजी होती है पूर्व वाले से बड़ा (छोटा) है क्योंकि मात्र मूल अवयव की हीप-गुण का उल्लंघन हो सकता है। यह मानते हुए कि हीप-गुण अवयव के बीच मान्य थी और अवयव स्वैप से पहले उसके बच्चे, अब बड़े (छोटे) कुंजी मान द्वारा इसका उल्लंघन नहीं किया जा सकता है। जब नवीन कुंजी पूर्व कुंजी से कम (अधिक) होती है तो मात्र निम्न-हीपिफाई की आवश्यकता होती है क्योंकि हीप-गुण का उल्लंघन मात्र बच्चों अवयवों में ही हो सकता है।
न्यूनता या वृद्धि कुंजी
कमी कुंजी परिचालन किसी दिए गए मान के साथ नोड के मान को कम मान से बदल देता है, और वृद्धि कुंजी परिचालन भी वही करता है परन्तु उच्च मान के साथ। इसमें दिए गए मान के साथ नोड ढूंढना, मान बदलना, और फिर हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाइंग या ऊपरहीपिफाइंग सम्मिलित है।
कमी कुंजी इस प्रकार की जा सकती है:
- उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं।
- नोड का मान घटाएं।
- हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई (अधिकतम हीप मानकर)।
कुंजी को इस प्रकार बढ़ाया जा सकता है:
- उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं।
- नोड का मान बढ़ाएँ।
- हीप गुण को पुनर्स्थापित करने के लिए ऊपर-हीपिफाइ (अधिकतम हीप मानकर)।
हीप बनाना
एन इनपुट अवयवों की एक सरणी से एक हीप का निर्माण एक रिक्त हीप से प्रारम्भ करके, फिर क्रमिक रूप से प्रत्येक अवयव को सम्मिलित करके किया जा सकता है। यह दृष्टिकोण, जिसे बाइनरी हीप के आविष्कारक के नाम पर विलियम्स विधि कहा जाता है, सरलता से O(n log n) समय में चलता हुआ देखा जाता है: यह प्रत्येक O(log n) लागत पर n निवेशन करता है।[lower-alpha 1]
यद्यपि, विलियम्स की विधि इष्टतम नहीं है। तीव्र विधि (रॉबर्ट डब्ल्यू फ़्लॉइड के कारण[8]) आकृति गुण का सम्मान करते हुए यादृच्छिक रूप से अवयवों को बाइनरी ट्री पर रखकर प्रारम्भ होता है (ट्री को सरणी द्वारा दर्शाया जा सकता है, नीचे देखें)। फिर सबसे निम्न स्तर से प्रारम्भ करके ऊपर की ओर बढ़ते हुए, प्रत्येक उपट्री की रूट को विलोपन एल्गोरिदम के अनुसार नीचे की ओर तब तक जांचे जब तक कि हीप गुण पुनः स्थापित न हो जाए। अधिक विशेष रूप से यदि कुछ ऊंचाई से प्रारम्भ होने वाले सभी उपट्री पहले से ही हेपीफाईड (सबसे निम्न स्तर के अनुरूप), ऊंचाई पर ट्री अधिकतम-हीप बनाते समय, या न्यूनतम-हीप बनाते समय न्यूनतम मानित बच्चों के पथ पर उनकी रूटों को नीचे भेजकर हीप किया जा सकता है। इस प्रक्रिया में प्रति नोड संचालन (स्वैप) लगता है । इस विधि में अधिकांश हीपिफाइ निम्न स्तरों पर होता है। चूंकि हीप की ऊंचाई है, ऊंचाई पर नोड की संख्या है । इसलिए, सभी उपट्री को हीप करने की लागत है:
यह इस तथ्य का उपयोग करता है कि दी गई अनंत श्रृंखला (गणित) अभिसरण श्रृंखला है।
उपरोक्त का यथार्थ मान (हीप निर्माण के समय तुलना की सबसे निकृष्ट स्थिति वाली संख्या) इसके बराबर माना जाता है:
जहाँ s2(n) बाइनरी प्रतिनिधित्व के सभी अंकों का योग n है और e2(n) का प्रतिपादक 2 है, जो n के अभाज्य गुणनखंडन में है ।
औसत स्थिति का विश्लेषण करना अधिक जटिल है, परन्तु इसे स्पर्शोन्मुख दृष्टिकोण 1.8814 n − 2 log2n + O(1) तुलना से दिखाया जा सकता है।[10][11]
इसके बाद आने वाला बिल्ड-मैक्स-हीप फ़ंक्शन, एक सरणी A को परिवर्तित करता है जो बार-बार अधिकतम-हीपिफ़ाई (अधिकतम-हीप के लिए निम्न-हीपिफ़ाई) का उपयोग करके उपरी विधि से एन नोड के साथ एक पूर्ण बाइनरी ट्री को अधिकतम-हीप में संग्रहीत करता है। floor(n/2) + 1, floor(n/2) + 2, ..., एन र (एन/2) + 2, ..., एन द्वारा अनुक्रमित सरणी अवयव ट्री के सभी पत्र हैं (यह मानते हुए कि सूचकांक 1 से प्रारम्भ होते हैं) - इस प्रकार प्रत्येक एक-अवयव का हीप है, और इसे नीचे-हीप करने की आवश्यकता नहीं है। बिल्ड-मैक्स-हीप शेष प्रत्येक ट्री नोड पर मैक्स-हीपिफाई चलाता है।
Build-Max-Heap (A):
for each index i from floor(length(A)/2) downto 1 do:
Max-Heapify(A, i)
हीप कार्यान्वयन
हीप को सामान्यतः सरणी डेटा संरचना के साथ कार्यान्वित किया जाता है। किसी भी बाइनरी ट्री को सरणी में संग्रहीत किया जा सकता है, परन्तु क्योंकि बाइनरी हीप सदैव पूर्ण बाइनरी ट्री होता है, इसे संहत रूप से संग्रहीत किया जा सकता है। सूचक (कंप्यूटर प्रोग्रामिंग) के लिए किसी स्थान की आवश्यकता नहीं है; इसके अतिरिक्त, प्रत्येक नोड के माता-पिता और बच्चों को सरणी सूचकांकों पर अंकगणित द्वारा पाया जा सकता है। ये गुण इस हीप कार्यान्वयन को अंतर्निहित डेटा संरचना या वंशावली सूची का सरल उदाहरण बनाते हैं। विवरण मूल स्थिति पर निर्भर करते हैं, जो इसके स्थान पर कार्यान्वयन के लिए उपयोग की जाने वाली प्रोग्रामिंग भाषा की बाधाओं या प्रोग्रामर की प्राथमिकता पर निर्भर हो सकते हैं। विशेष रूप से, कभी-कभी अंकगणित को सरल बनाने के लिए मूल को सूचकांक 1 पर रखा जाता है।
मान लीजिए n हीप में अवयवों की संख्या है और i हीप को संग्रहीत करने वाले सरणी का यादृच्छिक वैध सूचकांक है। यदि ट्री की रूट सूचकांक 0 पर है, वैध सूचकांक 0 से एन - 1 के साथ, तो सूचकांक i पर प्रत्येक अवयव a है
- सूचकांक 2i + 1 और 2i + 2 पर बच्चे
- सूचकांक फलक फलन पर इसका मूल ((i - 1) / 2)।
वैकल्पिक रूप से, यदि ट्री की रूट सूचकांक 1 पर है, वैध सूचकांक 1 से एन के साथ, तो सूचकांक i पर प्रत्येक अवयव a है
- सूचकांक 2i और 2i +1 पर बच्चे
- सूचकांक फलक फलन (i/2) पर इसका मूल।
इस कार्यान्वयन का उपयोग हीप सॉर्ट एल्गोरिदम में किया जाता है जो हीप को संग्रहीत करने के लिए इनपुट सरणी को आवंटित स्थान का पुन: उपयोग करता है (अर्थात एल्गोरिदम इन-प्लेस एल्गोरिदम किया जाता है)। यह कार्यान्वयन प्राथमिकता पंक्ति के रूप में भी उपयोगी है। जब गतिशील सरणी का उपयोग किया जाता है, तो असीमित संख्या में वस्तुों का क्षेपण संभव है।
upheap या downheap संचालन को सरणी के संदर्भ में निम्नानुसार बताया जा सकता है: मान लीजिए कि हीप गुण सूचकांक b, b + 1, ..., e के लिए है। सिफ्ट-निम्न फलन हीप गुण को b−1, b, b+1, ..., e तक बढ़ाता है। मात्र सूचकांक i = b−1 हीप गुण का उल्लंघन कर सकता है।
मान लें कि j श्रेणी b, ..., e के भीतर a[i] (अधिकतम-हीप के लिए, या न्यूनतम-हीप के लिए सबसे छोटे बच्चे) के सबसे बड़े बच्चे का सूचकांक है। (यदि ऐसा कोई सूचकांक स्थित नहीं है क्योंकि 2i > e तो हीप गुण नवीन विस्तारित सीमा के लिए बनी रहती है और कुछ भी करने की आवश्यकता नहीं होती है।) a[i] और a[j] मानों की गमागमन करके स्थिति i के लिए हीप गुण स्थापित की जाती है। इस बिंदु पर, एकमात्र समस्या यह है कि हीप गुण सूचकांक j के लिए मान्य नहीं हो सकती है।सिफ्ट-निम्न फलन को पश्च प्रत्यावर्तन |टेल-रिकर्सिव रूप से सूचकांक j पर तब तक लागू किया जाता है जब तक कि सभी अवयवों के लिए हीप गुण स्थापित नहीं हो जाती है।
सिफ्ट-निम्न फलन तीव्र है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह काम कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम लॉग में2 ई कदम आवश्यक हैं।
बड़े हीप और आभासी मेमोरी का उपयोग करने के लिए, उपरोक्त योजना के अनुसार अवयवों को सरणी में संग्रहीत करना अक्षम है: (लगभग) हर स्तर अलग पृष्ठ (कंप्यूटर मेमोरी) में है। बी-हीप ्स बाइनरी हीप हैं जो सबट्रीज़ को पेज में रखते हैं, जिससे एक्सेस किए गए पेजों की संख्या दस गुना तक कम हो जाती है।[12] दो बाइनरी ढेरों को मर्ज करने की प्रक्रिया समान आकार के ढेरों के लिए Θ(n) लेती है। सबसे अच्छा आप जो कर सकते हैं वह है (सरणी कार्यान्वयन के स्थिति में) बस दो हीप सारणियों को जोड़ना और परिणाम का हीप बनाना।[13] एन अवयवों पर हीप को ओ (लॉग एन लॉग के) कुंजी तुलनाओं का उपयोग करके, या पॉइंटर-आधारित कार्यान्वयन के स्थिति में, ओ (लॉग एन लॉग के) समय में, के अवयवों पर हीप के साथ विलय किया जा सकता है।[14] नवीन दृश्य के आधार पर, n अवयवों पर हीप को क्रमशः k और n-k अवयवों पर दो ढेरों में विभाजित करने के लिए एल्गोरिदम उप-ढेरों के क्रमबद्ध संग्रह के रूप में ढेरों को प्रस्तुत किया गया था।[15] एल्गोरिथम को O(log n * log n) तुलना की आवश्यकता होती है। यह दृश्य ढेरों के विलय के लिए नवीन और वैचारिक रूप से सरल एल्गोरिदम भी प्रस्तुत करता है। जब विलय सामान्य कार्य है, तो अलग हीप कार्यान्वयन की सिफारिश की जाती है, जैसे द्विपद हीप, जिसे ओ (लॉग एन) में विलय किया जा सकता है।
इसके अतिरिक्त, बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, परन्तु अवयव जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न अवयव को खोजने में समस्या होती है। इस अवयव को एल्गोरिदमिक रूप से या नोड में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - मात्र बच्चों के संदर्भों को संग्रहीत करने के अतिरिक्त, हम नोड के क्रम में उत्तराधिकारी को भी संग्रहीत करते हैं।
बिग ओ नोटेशन में सबसे छोटे और सबसे बड़े दोनों अवयवों के निष्कर्षण को संभव बनाने के लिए हीप संरचना को संशोधित करना संभव है| समय।[16] ऐसा करने के लिए, पंक्तियाँ न्यूनतम हीप और अधिकतम हीप के बीच वैकल्पिक होती हैं। एल्गोरिदम लगभग समान हैं, परन्तु, प्रत्येक चरण में, वैकल्पिक तुलनाओं के साथ वैकल्पिक पंक्तियों पर विचार करना चाहिए। प्रदर्शन लगभग सामान्य एकल दिशा हीप के समान है। इस विचार को न्यूनतम-अधिकतम-मध्यम हीप तक सामान्यीकृत किया जा सकता है।
सूचकांक समीकरणों की व्युत्पत्ति
एक सरणी-आधारित हीप में, नोड के बच्चों और माता-पिता को नोड के सूचकांक पर सरल अंकगणित के माध्यम से स्थित किया जा सकता है। यह खंड सूचकांक 0 पर रूट वाले ढेरों के लिए प्रासंगिक समीकरण प्राप्त करता है, सूचकांक 1 पर रूट वाले ढेरों पर अतिरिक्त नोट्स के साथ।
भ्रम से बचने के लिए, हम नोड के स्तर को रूट से उसकी दूरी के रूप में परिभाषित करेंगे, जैसे कि रूट स्वयं स्तर 0 पर हो।
बच्चों नोड
सूचकांक पर स्थित सामान्य नोड के लिए i (0 से प्रारम्भ करके), हम पहले इसके उचित बच्चे का सूचकांक प्राप्त करेंगे, ।
चलो नोड i स्तर पर स्थित हो L, और ध्यान दें कि कोई भी स्तर l बिल्कुल सम्मिलित है नोड। इसके अतिरिक्त, बिल्कुल हैं परतों तक और परत सहित परतों में निहित नोड l (बाइनरी अंकगणित के बारे में सोचें; 0111...111 = 1000...000 - 1)। क्योंकि रूट 0 पर संग्रहित है kवें नोड को सूचकांक पर संग्रहीत किया जाएगा । इन अवलोकनों को साथ रखने पर परत में अंतिम नोड के सूचकांक के लिए निम्नलिखित अभिव्यक्ति प्राप्त होती है l।
उसको रहनो दो j नोड के बाद नोड i परत L में, ऐसा कि
इनमें से प्रत्येक j नोड में बिल्कुल 2 बच्चे होने चाहिए, इसलिए होना ही चाहिए नोड को अलग करना i इसकी परत के अंत से दायाँ बच्चा ()।
आवश्यकता अनुसार।
यह देखते हुए कि किसी भी नोड का बायां बच्चा सदैव उसके दाएं बच्चे से 1 स्थान पहले होता है, हमें मिलता है ।
यदि रूट 0 के अतिरिक्त सूचकांक 1 पर स्थित है, तो प्रत्येक स्तर में अंतिम नोड सूचकांक पर है । इसका प्रयोग सम्पूर्ण पैदावार में करें और उन ढेरों के लिए जिनकी रूट 1 है।
मूल नोड
प्रत्येक नोड या तो अपने माता-पिता का बायाँ या दायाँ बच्चा है, इसलिए हम जानते हैं कि निम्नलिखित में से कोई भी सत्य है।
इस तरह,
अब अभिव्यक्ति पर विचार करें ।
यदि नोड यदि कोई बायाँ बच्चा है, तो यह तुरंत परिणाम देता है, यद्यपि, यदि नोड है तो यह उचित परिणाम भी देता है उचित बच्चा है। इस स्थिति में, सम होना चाहिए, और इसलिए अजीब होना चाहिए।
इसलिए, चाहे कोई नोड बायां या दायां बच्चा हो, उसके माता-पिता को अभिव्यक्ति द्वारा पाया जा सकता है:
संबंधित संरचनाएं
चूँकि हीप में भाई-बहनों का क्रम हीप गुण द्वारा निर्दिष्ट नहीं किया जाता है, एकल नोड के दो बच्चों को स्वतंत्र रूप से तब तक बदला जा सकता है जब तक कि ऐसा करने से आकार गुण का उल्लंघन न हो (फँसाना के साथ तुलना करें)। यद्यपि, ध्यान दें कि सामान्य सरणी-आधारित हीप में, मात्र बच्चों की गमागमन करने से हीप गुण को बनाए रखने के लिए बच्चों के उप-ट्री नोड को स्थानांतरित करने की भी आवश्यकता हो सकती है।
बाइनरी हीप डी-एरी हीप का विशेष मामला है जिसमें डी = 2 है।
चलने के समय का सारांश
Here are time complexities[17] of various heap data structures. Function names assume a min-heap. For the meaning of "O(f)" and "Θ(f)" see Big O notation.
| Operation | find-min | delete-min | insert | decrease-key | meld |
|---|---|---|---|---|---|
| Binary[17] | Θ(1) | Θ(log n) | O(log n) | O(log n) | Θ(n) |
| Leftist | Θ(1) | Θ(log n) | Θ(log n) | O(log n) | Θ(log n) |
| Binomial[17][18] | Θ(1) | Θ(log n) | Θ(1)[lower-alpha 3] | Θ(log n) | O(log n)[lower-alpha 4] |
| Fibonacci[17][19] | Θ(1) | O(log n)[lower-alpha 3] | Θ(1) | Θ(1)[lower-alpha 3] | Θ(1) |
| Pairing[20] | Θ(1) | O(log n)[lower-alpha 3] | Θ(1) | o(log n)[lower-alpha 3][lower-alpha 5] | Θ(1) |
| Brodal[23][lower-alpha 6] | Θ(1) | O(log n) | Θ(1) | Θ(1) | Θ(1) |
| Rank-pairing[25] | Θ(1) | O(log n)[lower-alpha 3] | Θ(1) | Θ(1)[lower-alpha 3] | Θ(1) |
| Strict Fibonacci[26] | Θ(1) | O(log n) | Θ(1) | Θ(1) | Θ(1) |
| 2–3 heap[27] | O(log n) | O(log n)[lower-alpha 3] | O(log n)[lower-alpha 3] | Θ(1) | ? |
- ↑ In fact, this procedure can be shown to take Θ(n log n) time in the worst case, meaning that n log n is also an asymptotic lower bound on the complexity.[1]: 167 In the average case (averaging over all permutations of n inputs), though, the method takes linear time.[8]
- ↑ This does not mean that sorting can be done in linear time since building a heap is only the first step of the heapsort algorithm.
- ↑ 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 Amortized time.
- ↑ n is the size of the larger heap.
- ↑ Lower bound of [21] upper bound of [22]
- ↑ Brodal and Okasaki later describe a persistent variant with the same bounds except for decrease-key, which is not supported. Heaps with n elements can be constructed bottom-up in O(n).[24]
यह भी देखें
- हीप (डेटा संरचना)
- हीप बनाएं और छांटें
संदर्भ
- ↑ 1.0 1.1 Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2009) [1990]. Introduction to Algorithms (3rd ed.). MIT Press and McGraw-Hill. ISBN 0-262-03384-4.
- ↑ Williams, J. W. J. (1964), "Algorithm 232 - Heapsort", Communications of the ACM, 7 (6): 347–348, doi:10.1145/512274.512284
- ↑ Y Narahari, "Binary Heaps", Data Structures and Algorithms
- ↑ Porter, Thomas; Simon, Istvan (Sep 1975). "प्राथमिकता कतार संरचना में यादृच्छिक प्रविष्टि". IEEE Transactions on Software Engineering. SE-1 (3): 292–298. doi:10.1109/TSE.1975.6312854. ISSN 1939-3520. S2CID 18907513.
- ↑ Mehlhorn, Kurt; Tsakalidis, A. (Feb 1989). "डेटा संरचनाएं". Universität des Saarlandes (in English). Universität des Saarlandes. p. 27. doi:10.22028/D291-26123.
Porter and Simon [171] analyzed the average cost of inserting a random element into a random heap in terms of exchanges. They proved that this average is bounded by the constant 1.61. Their proof docs not generalize to sequences of insertions since random insertions into random heaps do not create random heaps. The repeated insertion problem was solved by Bollobas and Simon [27]; they show that the expected number of exchanges is bounded by 1.7645. The worst-case cost of inserts and deletemins was studied by Gonnet and Munro [84]; they give log log n + O(1) and log n + log n* + O(1) bounds for the number of comparisons respectively.
- ↑ "python/cpython/heapq.py". GitHub (in English). Retrieved 2020-08-07.
- ↑ "heapq — Heap queue algorithm — Python 3.8.5 documentation". docs.python.org. Retrieved 2020-08-07.
heapq.heappushpop(heap, item): Push item on the heap, then pop and return the smallest item from the heap. The combined action runs more efficiently than heappush() followed by a separate call to heappop().
- ↑ 8.0 8.1 Hayward, Ryan; McDiarmid, Colin (1991). "Average Case Analysis of Heap Building by Repeated Insertion" (PDF). J. Algorithms. 12: 126–153. CiteSeerX 10.1.1.353.7888. doi:10.1016/0196-6774(91)90027-v. Archived from the original (PDF) on 2016-02-05. Retrieved 2016-01-28.
- ↑ Suchenek, Marek A. (2012), "Elementary Yet Precise Worst-Case Analysis of Floyd's Heap-Construction Program", Fundamenta Informaticae, 120 (1): 75–92, doi:10.3233/FI-2012-751.
- ↑ Doberkat, Ernst E. (May 1984). "ढेर बनाने के लिए फ़्लॉइड के एल्गोरिथम का एक औसत केस विश्लेषण" (PDF). Information and Control. 6 (2): 114–131. doi:10.1016/S0019-9958(84)80053-4.
- ↑ Pasanen, Tomi (November 1996). Elementary Average Case Analysis of Floyd's Algorithm to Construct Heaps (Technical report). Turku Centre for Computer Science. CiteSeerX 10.1.1.15.9526. ISBN 951-650-888-X. TUCS Technical Report No. 64. Note that this paper uses Floyd's original terminology "siftup" for what is now called sifting down.
- ↑ Kamp, Poul-Henning (June 11, 2010). "आपके द्वारा गलत किया जा रहा है". ACM Queue. Vol. 8, no. 6.
- ↑ Chris L. Kuszmaul. "binary heap" Archived 2008-08-08 at the Wayback Machine. Dictionary of Algorithms and Data Structures, Paul E. Black, ed., U.S. National Institute of Standards and Technology. 16 November 2009.
- ↑ J.-R. Sack and T. Strothotte "An Algorithm for Merging Heaps", Acta Informatica 22, 171-186 (1985).
- ↑ Sack, Jörg-Rüdiger; Strothotte, Thomas (1990). "ढेर और उसके अनुप्रयोगों का एक लक्षण वर्णन". Information and Computation. 86: 69–86. doi:10.1016/0890-5401(90)90026-E.
- ↑ Atkinson, M.D.; J.-R. Sack; N. Santoro & T. Strothotte (1 October 1986). "Min-max heaps and generalized priority queues" (PDF). Programming techniques and Data structures. Comm. ACM, 29(10): 996–1000.
- ↑ 17.0 17.1 17.2 17.3 Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L. (1990). Introduction to Algorithms (1st ed.). MIT Press and McGraw-Hill. ISBN 0-262-03141-8.
- ↑ "Binomial Heap | Brilliant Math & Science Wiki". brilliant.org (in English). Retrieved 2019-09-30.
- ↑ Fredman, Michael Lawrence; Tarjan, Robert E. (July 1987). "Fibonacci heaps and their uses in improved network optimization algorithms" (PDF). Journal of the Association for Computing Machinery. 34 (3): 596–615. CiteSeerX 10.1.1.309.8927. doi:10.1145/28869.28874.
- ↑ Iacono, John (2000), "Improved upper bounds for pairing heaps", Proc. 7th Scandinavian Workshop on Algorithm Theory (PDF), Lecture Notes in Computer Science, vol. 1851, Springer-Verlag, pp. 63–77, arXiv:1110.4428, CiteSeerX 10.1.1.748.7812, doi:10.1007/3-540-44985-X_5, ISBN 3-540-67690-2
- ↑ Fredman, Michael Lawrence (July 1999). "On the Efficiency of Pairing Heaps and Related Data Structures" (PDF). Journal of the Association for Computing Machinery. 46 (4): 473–501. doi:10.1145/320211.320214.
- ↑ Pettie, Seth (2005). Towards a Final Analysis of Pairing Heaps (PDF). FOCS '05 Proceedings of the 46th Annual IEEE Symposium on Foundations of Computer Science. pp. 174–183. CiteSeerX 10.1.1.549.471. doi:10.1109/SFCS.2005.75. ISBN 0-7695-2468-0.
- ↑ Brodal, Gerth S. (1996), "Worst-Case Efficient Priority Queues" (PDF), Proc. 7th Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 52–58
- ↑ Goodrich, Michael T.; Tamassia, Roberto (2004). "7.3.6. Bottom-Up Heap Construction". Data Structures and Algorithms in Java (3rd ed.). pp. 338–341. ISBN 0-471-46983-1.
- ↑ Haeupler, Bernhard; Sen, Siddhartha; Tarjan, Robert E. (November 2011). "Rank-pairing heaps" (PDF). SIAM J. Computing. 40 (6): 1463–1485. doi:10.1137/100785351.
- ↑ Brodal, Gerth Stølting; Lagogiannis, George; Tarjan, Robert E. (2012). Strict Fibonacci heaps (PDF). Proceedings of the 44th symposium on Theory of Computing - STOC '12. pp. 1177–1184. CiteSeerX 10.1.1.233.1740. doi:10.1145/2213977.2214082. ISBN 978-1-4503-1245-5.
- ↑ Takaoka, Tadao (1999), Theory of 2–3 Heaps (PDF), p. 12