बाइनरी हीप: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Variant of heap data structure}} {{Infobox data structure |name=Binary (min) heap |type=binary tree/heap | <!-- NOTE: Base of logarithms doesn't matter...")
 
No edit summary
 
(12 intermediate revisions by 4 users not shown)
Line 19: Line 19:
|find_min_avg=O(1)
|find_min_avg=O(1)
|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 में जे.डब्ल्यू.जे. विलियम्स द्वारा [[ढेर बनाएं और छांटें]] के लिए डेटा संरचना के रूप में पेश किया गया था।<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>
[[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>
*आकार गुण: एक बाइनरी हीप एक [[पूरा बाइनरी ट्री]] है; यानी, संभवतः अंतिम (सबसे गहरे) को छोड़कर, पेड़ के सभी स्तर पूरी तरह से भरे हुए हैं, और, यदि पेड़ का अंतिम स्तर पूरा नहीं हुआ है, तो उस स्तर के नोड्स बाएं से दाएं भरे हुए हैं।
*आकार गुण: बाइनरी हीप [[पूरा बाइनरी ट्री|पूर्ण बाइनरी ट्री]] है; अर्थात, संभवतः अंतिम (सबसे गहन) को छोड़कर, ट्री के सभी स्तर पूर्ण रूप से भरे हुए हैं, और, यदि ट्री का अंतिम स्तर पूर्ण नहीं हुआ है, तो उस स्तर के नोड बाएं से दाएं भरे हुए हैं।
*हीप संपत्ति: कुछ कुल क्रम के अनुसार, प्रत्येक नोड में संग्रहीत कुंजी या तो (≥) से अधिक या उसके बराबर है या नोड के बच्चों में कुंजी से कम या (≤) के बराबर है।
*हीप गुण: कुछ कुल क्रम के अनुसार, प्रत्येक नोड में संग्रहीत कुंजी या तो (≥) से अधिक या उसके बराबर है या नोड के चाइल्ड में कुंजी से कम या (≤) के बराबर है।


वे ढेर जहां मूल कुंजी चाइल्ड कुंजी (≥) से अधिक या उसके बराबर होती है, मैक्स-हीप्स कहलाती है; वे जहां यह (≤) से कम या बराबर है उन्हें मिन-हीप्स कहा जाता है। कुशल (लघुगणक समय) एल्गोरिदम को बाइनरी हीप पर प्राथमिकता कतार को लागू करने के लिए आवश्यक दो ऑपरेशनों के लिए जाना जाता है: एक तत्व डालना, और क्रमशः न्यूनतम-ढेर या अधिकतम-ढेर से सबसे छोटे या सबसे बड़े तत्व को हटाना। बाइनरी हीप्स को आमतौर पर हीप्सॉर्ट [[छँटाई एल्गोरिथ्म]] में भी नियोजित किया जाता है, जो एक इन-प्लेस एल्गोरिदम है क्योंकि बाइनरी हीप्स को एक [[अंतर्निहित डेटा संरचना]] के रूप में कार्यान्वित किया जा सकता है, एक सरणी में चाबियाँ संग्रहीत करना और बच्चे-अभिभावक संबंधों का प्रतिनिधित्व करने के लिए उस सरणी के भीतर उनके सापेक्ष पदों का उपयोग करना .
इस प्रकार से वे हीप जहां मूल कुंजी चाइल्ड कुंजी (≥) से अधिक या उसके बराबर होती है, मैक्स-हीप कहलाती है; वे जहां यह (≤) से कम या बराबर है उन्हें लघु-हीप कहा जाता है। कुशल (लघुगणक समय) एल्गोरिदम को बाइनरी हीप पर प्राथमिकता पंक्ति को लागू करने के लिए आवश्यक दो परिचालनों के लिए जाना जाता है: अवयव निवेशन, और क्रमशः न्यूनतम-हीप या अधिकतम-हीप से सबसे छोटे या सबसे बड़े अवयव को हटाना। इस प्रकार से बाइनरी हीप को सामान्यतः हीप सॉर्ट [[छँटाई एल्गोरिथ्म|सोर्टिंग एल्गोरिदम]] में भी नियोजित किया जाता है, जो इन-प्लेस एल्गोरिदम है क्योंकि बाइनरी हीप को [[अंतर्निहित डेटा संरचना]] के रूप में कार्यान्वित किया जा सकता है, सरणी में कुंजी संग्रहीत करना और चाइल्ड-अभिभावक संबंधों का प्रतिनिधित्व करने के लिए उस सरणी के भीतर उनके सापेक्ष पदों का उपयोग करना।


==ढेर परिचालन==
==हीप परिचालन==
सम्मिलित करने और हटाने के दोनों ऑपरेशन पहले ढेर के अंत से जोड़कर या हटाकर, आकार संपत्ति के अनुरूप ढेर को संशोधित करते हैं। फिर ढेर की संपत्ति को ढेर के ऊपर या नीचे जाकर बहाल किया जाता है। दोनों ऑपरेशन लगते हैं {{nowrap|O(log ''n'')}} समय।
इस प्रकार से सम्मिलित करने और हटाने के दोनों परिचालन पहले हीप के अंत से जोड़कर या हटाकर, आकार गुण के अनुरूप हीप को संशोधित करते हैं। फिर हीप की गुण को हीप के अप या नीचे जाकर पुनः स्थापित किया जाता है। दोनों परिचालन में {{nowrap|O(log ''n'')}} समय लगता है।


=== सम्मिलित करें ===
=== निवेशन ===
ढेर में एक तत्व जोड़ने के लिए, हम यह एल्गोरिदम निष्पादित कर सकते हैं:
इस प्रकार से हीप में अवयव जोड़ने के लिए, हम यह एल्गोरिदम निष्पादित कर सकते हैं:


#तत्व को सबसे बाईं ओर खुले स्थान पर ढेर के निचले स्तर पर जोड़ें।
#अवयव को सबसे बाईं ओर संवृत स्थान पर हीप के निम्न स्तर पर जोड़ें।
#जोड़े गए तत्व की उसके मूल तत्व से तुलना करें; यदि वे सही क्रम में हैं, तो रुकें।
#जोड़े गए अवयव की उसके मूल अवयव से तुलना करें; यदि वे उचित क्रम में हैं, तो रुकें।
#यदि नहीं, तो तत्व को उसके मूल तत्व से बदलें और पिछले चरण पर वापस लौटें।
#यदि नहीं, तो अवयव को उसके मूल अवयव से बदलें और पूर्व चरण पर वापस लौटें।
चरण 2 और 3, जो एक नोड की उसके मूल के साथ तुलना और संभवतः अदला-बदली करके ढेर संपत्ति को बहाल करते हैं, अप-हीप ऑपरेशन कहलाते हैं (जिसे बबल-अप, परकोलेट-अप, सिफ्ट-अप, ट्रिकल-अप, स्विम- के रूप में भी जाना जाता है)। ऊपर, ढेर लगाना, या कैस्केड-अप करना)।
अतः चरण 2 और 3, जो नोड की उसके मूल के साथ तुलना और संभवतः गमागमन करके हीप गुण को पुनः स्थापित करते हैं, अपहीप परिचालन कहलाते हैं (बबल-अप, परकोलेट-अप, सिफ्ट-अप, ट्रिकल-अप, स्विम-अप, हीपफाई-अप या कैस्केड-अप के रूप में भी जाना जाता है)।


आवश्यक संचालन की संख्या केवल उन स्तरों की संख्या पर निर्भर करती है जो नए तत्व को ढेर संपत्ति को संतुष्ट करने के लिए बढ़ाना चाहिए। इस प्रकार, सम्मिलन ऑपरेशन में सबसे खराब स्थिति वाली समय जटिलता होती है {{nowrap|O(log ''n'')}}. यादृच्छिक ढेर के लिए, और बार-बार सम्मिलन के लिए, सम्मिलन ऑपरेशन में O(1) की औसत-केस जटिलता होती है।<ref>{{Cite journal|last1=Porter|first1=Thomas|last2=Simon|first2=Istvan|date=Sep 1975|title=प्राथमिकता कतार संरचना में यादृच्छिक प्रविष्टि|journal=IEEE Transactions on Software Engineering|volume=SE-1|issue=3|pages=292–298|doi=10.1109/TSE.1975.6312854|s2cid=18907513|issn=1939-3520}}</ref><ref>{{Cite web |last1=Mehlhorn|first1=Kurt|last2=Tsakalidis|first2=A.|date=Feb 1989| title=डेटा संरचनाएं|website=Universität des Saarlandes |url=https://publikationen.sulb.uni-saarland.de/handle/20.500.11880/26179 |language=en|page=27|publisher=Universität des Saarlandes |doi=10.22028/D291-26123 |quote=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.}}</ref>
आवश्यक संचालन की संख्या मात्र उन स्तरों की संख्या पर निर्भर करती है जो नवीन अवयव को हीप गुण को संतुष्ट करने के लिए बढ़ाना चाहिए। इस प्रकार, निवेशन परिचालन में {{nowrap|O(log ''n'')}} की सबसे निकृष्ट स्थिति वाली समय जटिलता होती है। यादृच्छिक हीप के लिए, और बार-बार निवेशन के लिए, निवेशन परिचालन में O(1) की औसत-केस जटिलता होती है।<ref>{{Cite journal|last1=Porter|first1=Thomas|last2=Simon|first2=Istvan|date=Sep 1975|title=प्राथमिकता कतार संरचना में यादृच्छिक प्रविष्टि|journal=IEEE Transactions on Software Engineering|volume=SE-1|issue=3|pages=292–298|doi=10.1109/TSE.1975.6312854|s2cid=18907513|issn=1939-3520}}</ref><ref>{{Cite web |last1=Mehlhorn|first1=Kurt|last2=Tsakalidis|first2=A.|date=Feb 1989| title=डेटा संरचनाएं|website=Universität des Saarlandes |url=https://publikationen.sulb.uni-saarland.de/handle/20.500.11880/26179 |language=en|page=27|publisher=Universität des Saarlandes |doi=10.22028/D291-26123 |quote=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.}}</ref>
बाइनरी हीप इंसर्शन के उदाहरण के रूप में, मान लें कि हमारे पास एक अधिकतम-हीप है


::[[File:Heap add step1.svg|150px]]और हम ढेर में संख्या 15 जोड़ना चाहते हैं। हम पहले 15 को एक्स द्वारा चिह्नित स्थान पर रखते हैं। हालाँकि, तब से ढेर संपत्ति का उल्लंघन होता है {{nowrap|15 > 8}}, इसलिए हमें 15 और 8 को स्वैप करने की आवश्यकता है। इसलिए, हमारे पास पहले स्वैप के बाद ढेर इस प्रकार दिखेगा:
इस प्रकार से बाइनरी हीप निवेशन के उदाहरण के रूप में, मान लें कि हमारे गुण अधिकतम-हीप


::[[File:Heap add step2.svg|150px]]हालाँकि ढेर संपत्ति का अभी भी उल्लंघन किया जा रहा है {{nowrap|15 > 11}}, इसलिए हमें फिर से स्वैप करने की आवश्यकता है:
::[[File:Heap add step1.svg|150px]]
::है और हम हीप में संख्या 15 जोड़ना चाहते हैं। हम पहले 15 को एक्स द्वारा चिह्नित स्थान पर रखते हैं। यद्यपि, हीप गुण का उल्लंघन 15 > 8 से हुआ है, इसलिए हमें 15 और 8 को स्वैप करने की आवश्यकता है। इसलिए, पहले स्वैप के बाद हमारे गुण हीप इस प्रकार दिख रहा है:


::[[File:Heap add step3.svg|150px]]जो एक वैध अधिकतम-ढेर है। इस अंतिम चरण के बाद बाएं बच्चे की जांच करने की कोई आवश्यकता नहीं है: शुरुआत में, अधिकतम-हीप वैध था, जिसका अर्थ है कि रूट पहले से ही अपने बाएं बच्चे से बड़ा था, इसलिए रूट को और भी अधिक मूल्य के साथ बदलने से वह संपत्ति बनी रहेगी प्रत्येक नोड अपने बच्चों से बड़ा है ({{nowrap|11 > 5}}; अगर {{nowrap|15 > 11}}, और {{nowrap|11 > 5}}, तब {{nowrap|15 > 5}}, [[सकर्मक संबंध]] के कारण)।
::[[File:Heap add step2.svg|150px]]
::यद्यपि हीप गुण का अभी भी उल्लंघन किया जा रहा है {{nowrap|15 > 11}}, इसलिए हमें फिर से स्वैप करने की आवश्यकता है:


===निकालें===
::[[File:Heap add step3.svg|150px]]
हीप संपत्ति को बनाए रखते हुए हीप से रूट को हटाने की प्रक्रिया (अधिकतम-हीप में अधिकतम तत्व या न्यूनतम-हीप में न्यूनतम तत्व को प्रभावी ढंग से निकालना) इस प्रकार है:
::इस प्रकार से जो वैध अधिकतम-हीप है। इस अंतिम चरण के बाद बाएं चाइल्ड की जांच करने की कोई आवश्यकता नहीं है: प्रारम्भ में, अधिकतम-हीप वैध था, जिसका अर्थ है कि रूट पहले से ही अपने बाएं चाइल्ड से बड़ा था, इसलिए रूट को और भी अधिक मान के साथ बदलने से वह गुण बनी रहेगी प्रत्येक नोड अपने चाइल्ड से बड़ा है ({{nowrap|11 > 5}}; यदि {{nowrap|15 > 11}}, और {{nowrap|11 > 5}}, तो [[सकर्मक संबंध]] के कारण {{nowrap|15 > 5}}, )


#ढेर की जड़ को अंतिम स्तर पर अंतिम तत्व से बदलें।
===निष्कर्षण===
#नई जड़ की तुलना उसके बच्चों से करें; यदि वे सही क्रम में हैं, तो रुकें।
हीप गुण को बनाए रखते हुए हीप से रूट को हटाने की प्रक्रिया (अधिकतम-हीप में अधिकतम अवयव या न्यूनतम-हीप में न्यूनतम अवयव को प्रभावी रूप से निकालना) इस प्रकार है:
#यदि नहीं, तो तत्व को उसके किसी एक बच्चे के साथ बदलें और पिछले चरण पर वापस लौटें। (मिन-हीप में इसके छोटे बच्चे और मैक्स-हीप में इसके बड़े बच्चे के साथ स्वैप करें।)
चरण 2 और 3, जो अपने बच्चों में से एक के साथ एक नोड की तुलना और संभवतः स्वैप करके ढेर संपत्ति को पुनर्स्थापित करते हैं, को डाउन-हीप कहा जाता है (जिसे बबल-डाउन, परकोलेट-डाउन, सिफ्ट-डाउन, सिंक-डाउन, ट्रिकल के रूप में भी जाना जाता है) डाउन, हीपिफ़ाइ-डाउन, कैस्केड-डाउन, एक्स्ट्रैक्ट-मिन या एक्स्ट्रैक्ट-मैक्स, या बस हीपिफ़ाई) ऑपरेशन।


इसलिए, यदि हमारे पास पहले जैसा ही अधिकतम-ढेर है
#हीप की रूट को अंतिम स्तर पर अंतिम अवयव से बदलें।
#नवीन रूट की तुलना उसके चाइल्ड से करें; यदि वे उचित क्रम में हैं, तो रुकें।
#यदि नहीं, तो अवयव को उसके किसी चाइल्ड के साथ बदलें और पूर्व चरण पर वापस लौटें। (लघु-हीप में इसके छोटे चाइल्ड और उच्च-हीप में इसके बड़े चाइल्ड के साथ स्वैप करें।)
चरण 2 और 3, जो एक नोड की उसके चाइल्ड में से किसी एक के साथ तुलना करके और संभवतः स्वैप करके हीप गुण को पुनर्स्थापित करते हैं, निम्न-हीप (बबल-निम्न, परकोलेट-निम्न, सिफ्ट-निम्न, सिंक-निम्न, ट्रिकल निम्न, हीपफाई-निम्न, कैस्केड-निम्न, निष्कर्षण-लघु या एक्सट्रैक्ट-मैक्स, या मात्र हीपफाई के रूप में भी जाना जाता है) परिचालन कहलाते हैं।


::[[File:Heap delete step0.svg|150px]]हम 11 को हटाते हैं और इसे 4 से प्रतिस्थापित करते हैं।
इसलिए, यदि हमारे गुण पहले जैसा ही अधिकतम-हीप है


::[[File:Heap remove step1.svg|150px]]अब हीप संपत्ति का उल्लंघन हो गया है क्योंकि 8, 4 से बड़ा है। इस मामले में, दो तत्वों, 4 और 8 की अदला-बदली, हीप संपत्ति को बहाल करने के लिए पर्याप्त है और हमें आगे तत्वों की अदला-बदली करने की आवश्यकता नहीं है:
::[[File:Heap delete step0.svg|150px]]
::हम 11 को हटाते हैं और इसे 4 से प्रतिस्थापित करते हैं।


::[[File:Heap remove step2.svg|150px]]नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े बच्चों के साथ स्वैप किया जाता है (मिन-हीप में इसे अपने छोटे बच्चे के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नई स्थिति में हीप प्रॉपर्टी को संतुष्ट नहीं करता है। यह कार्यक्षमता 'मैक्स-हीपिफाई' फ़ंक्शन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (ए) के ऐरे डेटा संरचना-समर्थित हीप ए के लिए छद्म कोड में नीचे परिभाषित किया गया है। A को 1 से शुरू करके अनुक्रमित किया गया है।
::[[File:Heap remove step1.svg|150px]]
::इस प्रकार से अब हीप गुण का उल्लंघन हो गया है क्योंकि 8, 4 से बड़ा है। इस स्थिति में, दो अवयवों, 4 और 8 की गमागमन, हीप गुण को पुनः स्थापित करने के लिए पर्याप्त है और हमें आगे अवयवों की गमागमन करने की आवश्यकता नहीं है:


// मैक्स-हीप के लिए डाउन-हीप या हीपिफाई-डाउन ऑपरेशन करें
::[[File:Heap remove step2.svg|150px]]
  // : ढेर का प्रतिनिधित्व करने वाली एक सरणी, 1 से शुरू होकर अनुक्रमित
::नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े चाइल्ड के साथ स्वैप किया जाता है (लघु-हीप में इसे अपने छोटे चाइल्ड के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नवीन स्थिति में हीप गुण को संतुष्ट नहीं करता है। अतः यह कार्यक्षमता'''<nowiki/>''' '''<nowiki/>'मैक्स-हीपिफाई'''' फलन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (A) के सरणी डेटा संरचना-समर्थित हीप A के लिए छद्म कोड में नीचे परिभाषित किया गया है। A को 1 से प्रारम्भ करके अनुक्रमित किया गया है।
  // i: नीचे ढेर लगाते समय शुरू होने वाला सूचकांक
 
  'मैक्स-हीपिफाई'(, आई):
// Perform a down-heap or heapify-down operation for a max-heap
    बाएँ 2×i
  // ''A'': an array representing the heap, indexed starting at 1
     दाएं 2×i + 1
  // ''i'': the index to start at when heapifying down
     सबसे बड़ा ← i
 
  '''Max-Heapify'''(''A'', ''i''):
  ''left'' 2×''i''
 
     ''right'' 2×''i'' + 1
 
     ''largest'' ''i''
      
      
     'यदि' बायां लंबाई() 'और' [बाएं] > [सबसे बड़ा] 'तब':
     '''if''' ''left'' ''length''(''A'') '''and''' ''A''[''left''] > A[''largest''] '''then''':
         सबसे बड़ा बायां<br />
 
     'अगर' सही लंबाई() 'और' [दाएं] > [सबसे बड़ा] 'तब':
         ''largest'' ''left''<br />
         सबसे बड़ा सही
     '''if''' ''right'' ''length''(''A'') '''and''' ''A''[''right''] > ''A''[''largest''] '''then''':
 
         ''largest'' ''right''
      
      
     'यदि' सबसे बड़ा मैं 'तब':
     '''if''' ''largest'' ≠ ''i'' '''then''':
        'स्वैप' ए[i] और ए[सबसे बड़ा]
        'मैक्स-हीपिफाई' (ए, सबसे बड़ा)


उपरोक्त एल्गोरिदम के लिए सरणी को सही ढंग से पुन: ढेर करने के लिए, सूचकांक i और उसके दो प्रत्यक्ष बच्चों के नोड के अलावा कोई भी नोड ढेर संपत्ति का उल्लंघन नहीं कर सकता है। डाउन-हीप ऑपरेशन (पूर्ववर्ती स्वैप के बिना) का उपयोग रूट के मूल्य को संशोधित करने के लिए भी किया जा सकता है, तब भी जब कोई तत्व हटाया नहीं जा रहा हो।
        '''swap''' ''A''[''i''] and ''A''[''largest'']
        '''Max-Heapify'''(''A'', ''largest'')
उपरोक्त एल्गोरिदम के लिए सरणी को उचित रूप से पुन: हीप करने के लिए, सूचकांक i और उसके दो प्रत्यक्ष चाइल्ड के नोड के अतिरिक्त कोई भी नोड हीप गुण का उल्लंघन नहीं कर सकता है। निम्न-हीप परिचालन (पूर्ववर्ती स्वैप के बिना) का उपयोग रूट के मान को संशोधित करने के लिए भी किया जा सकता है, तब भी जब कोई अवयव हटाया नहीं जा रहा हो।


सबसे खराब स्थिति में, नए रूट को प्रत्येक स्तर पर अपने बच्चे के साथ तब तक स्वैप करना पड़ता है जब तक कि यह ढेर के निचले स्तर तक नहीं पहुंच जाता है, जिसका अर्थ है कि डिलीट ऑपरेशन में पेड़ की ऊंचाई के सापेक्ष समय जटिलता है, या (लॉग एन) ).
सबसे निकृष्ट स्थिति में, नवीन रूट को प्रत्येक स्तर पर अपने चाइल्ड के साथ तब तक स्वैप करना पड़ता है जब तक कि यह हीप के निम्न स्तर तक नहीं पहुंच जाता है, जिसका अर्थ है कि डिलीट परिचालन में ट्री की ऊंचाई के सापेक्ष समय जटिलता है, या O(log n)


=== डालें फिर निकालें ===
=== निवेशन फिर निष्कर्षण ===
किसी तत्व को सम्मिलित करना और फिर ढेर से निकालना ऊपर परिभाषित इन्सर्ट और एक्सट्रेक्ट फ़ंक्शंस को कॉल करने की तुलना में अधिक कुशलता से किया जा सकता है, जिसमें दोनों शामिल होंगे <code>upheap</code> और <code>downheap</code> कार्यवाही। इसके बजाय, हम बस एक कर सकते हैं <code>downheap</code> ऑपरेशन, इस प्रकार है:
अतः किसी अवयव को सम्मिलित करना और फिर हीप से निकालना अप परिभाषित निवेशन और निष्कर्षण संक्रिया को कॉल करने की तुलना में अधिक कुशलता से किया जा सकता है, जिसमें दोनों <code>upheap</code> और <code>downheap</code> संक्रिया सम्मिलित होंगे। इस प्रकार से इसके अतिरिक्त, हम मात्र <code>downheap</code> परिचालन कर सकते हैं, इस प्रकार है:


# तुलना करें कि क्या हम जिस वस्तु को आगे बढ़ा रहे हैं या ढेर के शीर्ष पर झांक रहा है वह बड़ा है (अधिकतम ढेर मानते हुए)
# तुलना करें कि क्या हम जिस वस्तु को आगे बढ़ा रहे हैं या हीप के शीर्ष पर झांक रहा है वह बड़ा है (अधिकतम हीप मानते हुए)
#यदि ढेर की जड़ बड़ी हो:
#यदि हीप की रूट बड़ी हो:
## रूट को नए आइटम से बदलें
## रूट को नवीन वस्तु से बदलें।
## जड़ से शुरू करके डाउन-हीपिफाई करना
## रूट से प्रारम्भ करके निम्न-हीपिफाई करना।
# अन्यथा, वह आइटम वापस कर दें जिसे हम आगे बढ़ा रहे हैं
# अन्यथा, वह वस्तु वापस कर दें जिसे हम आगे बढ़ा रहे हैं।


[[पायथन (प्रोग्रामिंग भाषा)]] सम्मिलन और फिर निष्कर्षण के लिए हेप्पुशपॉप नामक एक ऐसा फ़ंक्शन प्रदान करता है, जिसे नीचे संक्षेप में प्रस्तुत किया गया है।<ref>{{Cite web| title=python/cpython/heapq.py| url=https://github.com/python/cpython/blob/master/Lib/heapq.py|access-date=2020-08-07| website=GitHub| language=en}}</ref><ref>{{Cite web|title=heapq — Heap queue algorithm — Python 3.8.5 documentation| url=https://docs.python.org/3/library/heapq.html#heapq.heappushpop|access-date=2020-08-07| website=docs.python.org|quote=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().}}</ref> माना जाता है कि हीप सरणी का पहला तत्व सूचकांक 1 पर है।
इस प्रकार से [[पायथन (प्रोग्रामिंग भाषा)|पायथन (प्रोग्रामिंग लैंग्वेज)]] निवेशन और फिर निष्कर्षण के लिए हीपपुशपॉप नामक ऐसा फलन प्रदान करता है, जिसे नीचे संक्षेप में प्रस्तुत किया गया है।<ref>{{Cite web| title=python/cpython/heapq.py| url=https://github.com/python/cpython/blob/master/Lib/heapq.py|access-date=2020-08-07| website=GitHub| language=en}}</ref><ref>{{Cite web|title=heapq — Heap queue algorithm — Python 3.8.5 documentation| url=https://docs.python.org/3/library/heapq.html#heapq.heappushpop|access-date=2020-08-07| website=docs.python.org|quote=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().}}</ref> माना जाता है कि हीप सरणी का पहला अवयव सूचकांक 1 पर है।
  // एक नए आइटम को (अधिकतम) ढेर पर पुश करें और फिर परिणामी ढेर की जड़ निकालें।
  // Push a new item to a (max) heap and then extract the root of the resulting heap.
  // ढेर: ढेर का प्रतिनिधित्व करने वाली एक सरणी, 1 पर अनुक्रमित
  // ''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''.
'पुश-पॉप'(ढेर: सूची<टी>, आइटम: टी) -> टी:
    'यदि' ढेर खाली नहीं है 'और' ढेर[1] > आइटम 'तब': // < यदि न्यूनतम ढेर
        'स्वैप' ढेर[1] और आइटम
        _डाउनहीप (सूचकांक 1 से शुरू होने वाला ढेर)
    'वापसी के लिए वस्तु
एक समान फ़ंक्शन को पॉपिंग और फिर डालने के लिए परिभाषित किया जा सकता है, जिसे पायथन में heapreplace कहा जाता है:
// ढेर की जड़ निकालें, और एक नया आइटम पुश करें
// ढेर: ढेर का प्रतिनिधित्व करने वाली एक सरणी, 1 पर अनुक्रमित
// आइटम: सम्मिलित करने के लिए एक तत्व
// ढेर की वर्तमान जड़ लौटाता है
'बदलें'(ढेर: सूची<टी>, आइटम: टी) -> टी:
    'स्वैप' ढेर[1] और आइटम
    _डाउनहीप (सूचकांक 1 से शुरू होने वाला ढेर)
    'वापसी के लिए वस्तु


=== खोजें ===
'''Push-Pop'''(''heap'': List<T>, ''item'': T) -> T:
एक मनमाना तत्व ढूँढने में O(n) समय लगता है।
    '''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''


# सूचकांक खोजें <math>i</math> जिस तत्व को हम हटाना चाहते हैं
'''swap''' ''heap''[1] and ''item''
# इस तत्व को अंतिम तत्व से बदलें
    _downheap(''heap'' starting from index 1)
# ढेर संपत्ति को पुनर्स्थापित करने के लिए डाउन-हीपिफाई या अप-हीपिफाई करें। अधिकतम-हीप (न्यूनतम-हीप) में, अप-हीपिफ़ाइ की आवश्यकता केवल तब होती है जब तत्व की नई कुंजी होती है <math>i</math> पिछले वाले से बड़ा (छोटा) है क्योंकि केवल मूल तत्व की ढेर-संपत्ति का उल्लंघन हो सकता है। यह मानते हुए कि ढेर-संपत्ति तत्व के बीच मान्य थी <math>i</math> और तत्व स्वैप से पहले उसके बच्चे, अब बड़े (छोटे) कुंजी मान द्वारा इसका उल्लंघन नहीं किया जा सकता है। जब नई कुंजी पिछली कुंजी से कम (अधिक) होती है तो केवल डाउन-हीपिफाई की आवश्यकता होती है क्योंकि हीप-प्रॉपर्टी का उल्लंघन केवल चाइल्ड तत्वों में ही हो सकता है।
    '''return''' ''item''


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


कमी कुंजी इस प्रकार की जा सकती है:
=== विलोप ===
इस प्रकार से किसी यादृच्छिक अवयव को हटाना इस प्रकार किया जा सकता है:


# उस तत्व का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं
# जिस अवयव को हम हटाना चाहते हैं उसका सूचकांक <math>i</math> ढूंढें।
# नोड का मान घटाएं
# इस अवयव को अंतिम अवयव से बदलें।
# ढेर संपत्ति को पुनर्स्थापित करने के लिए डाउन-हीपिफाई (अधिकतम ढेर मानकर)
# हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई या अपहीपिफाई करें। अधिकतम-हीप (न्यूनतम-हीप) में, अपहीपिफ़ाइ की आवश्यकता मात्र तब होती है जब <math>i</math> अवयव की नवीन कुंजी होती है पूर्व वाले से बड़ा (छोटा) है क्योंकि मात्र मूल अवयव की हीप-गुण का उल्लंघन हो सकता है। यह मानते हुए कि हीप-गुण अवयव <math>i</math> के बीच मान्य थी और अवयव स्वैप से पहले उसके चाइल्ड, अब बड़े (छोटे) कुंजी मान द्वारा इसका उल्लंघन नहीं किया जा सकता है। जब नवीन कुंजी पूर्व कुंजी से कम (अधिक) होती है तो मात्र निम्न-हीपिफाई की आवश्यकता होती है क्योंकि हीप-गुण का उल्लंघन मात्र चाइल्ड अवयवों में ही हो सकता है।


कुंजी को इस प्रकार बढ़ाया जा सकता है:
=== न्यूनता या वृद्धि कुंजी ===
अतः न्यूनता कुंजी परिचालन किसी दिए गए मान के साथ नोड के मान को कम मान से बदल देता है, और वृद्धि कुंजी परिचालन भी वही करता है परन्तु उच्च मान के साथ। इसमें दिए गए मान के साथ नोड ढूंढना, मान बदलना, और फिर हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाइंग या अपहीपिफाइंग सम्मिलित है।


# उस तत्व का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं
इस प्रकार से न्यूनता कुंजी इस प्रकार की जा सकती है:
# नोड का मान बढ़ाएँ
# ढेर संपत्ति को पुनर्स्थापित करने के लिए ऊपर-ढेरीकरण (अधिकतम ढेर मानकर)।


==ढेर बनाना==
# उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं।
की एक श्रृंखला से ढेर बनाना {{mvar|n}} इनपुट तत्वों को एक खाली ढेर से शुरू करके, फिर क्रमिक रूप से प्रत्येक तत्व को सम्मिलित करके किया जा सकता है। यह दृष्टिकोण, जिसे बाइनरी हीप्स के आविष्कारक के नाम पर विलियम्स विधि कहा जाता है, आसानी से चलता हुआ देखा जाता है {{math|''O''(''n'' log ''n'')}} समय: यह कार्यान्वित होता है {{mvar|n}} पर सम्मिलन {{math|''O''(log ''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}}) आकृति गुण का सम्मान करते हुए मनमाने ढंग से तत्वों को बाइनरी ट्री पर रखकर शुरू होता है (पेड़ को एक सरणी द्वारा दर्शाया जा सकता है, नीचे देखें)। फिर सबसे निचले स्तर से शुरू करके ऊपर की ओर बढ़ते हुए, प्रत्येक उपवृक्ष की जड़ को विलोपन एल्गोरिथ्म के अनुसार नीचे की ओर तब तक छानें जब तक कि ढेर गुण बहाल न हो जाए। अधिक विशेष रूप से यदि सभी उपवृक्ष कुछ ऊंचाई से शुरू होते हैं <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>. इसलिए, सभी उपवृक्षों को ढेर करने की लागत है:
इस प्रकार से कुंजी को इस प्रकार बढ़ाया जा सकता है:
 
# उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं।
# नोड का मान बढ़ाएँ।
# हीप गुण को पुनर्स्थापित करने के लिए अप-हीपिफाइ (अधिकतम हीप मानकर)।
 
==हीप बनाना==
इस प्रकार से n इनपुट अवयवों की एक सरणी से एक हीप का निर्माण एक रिक्त हीप से प्रारम्भ करके, फिर क्रमिक रूप से प्रत्येक अवयव को सम्मिलित करके किया जा सकता है। यह दृष्टिकोण, जिसे बाइनरी हीप के आविष्कारक के नाम पर विलियम्स विधि कहा जाता है, सरलता से '''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}}) आकृति गुण का सम्मान करते हुए यादृच्छिक रूप से अवयवों को बाइनरी ट्री पर रखकर प्रारम्भ होता है (ट्री को सरणी द्वारा दर्शाया जा सकता है, नीचे देखें)। फिर सबसे निम्न स्तर से प्रारम्भ करके अप की ओर बढ़ते हुए, प्रत्येक उपट्री की रूट को विलोपन एल्गोरिदम के अनुसार नीचे की ओर तब तक जांचे जब तक कि हीप गुण पुनः स्थापित न हो जाए। अतः अधिक विशेष रूप से यदि कुछ ऊंचाई <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 151: 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 165: 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|''s''<sub>2</sub>(''n'')}} [[हथौड़ा चलाना वजन|बाइनरी प्रतिनिधित्व के सभी अंकों का योग]] {{mvar|n}} है और {{math|''e''<sub>2</sub>(''n'')}} का प्रतिपादक {{math|2}} है, जो {{mvar|n}} के अभाज्य गुणनखंडन में है।


औसत मामले का विश्लेषण करना अधिक जटिल है, लेकिन इसे स्पर्शोन्मुख दृष्टिकोण से दिखाया जा सकता है {{math|1.8814&nbsp;''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
औसत स्थिति का विश्लेषण करना अधिक जटिल है, परन्तु इसे स्पर्शोन्मुख दृष्टिकोण {{math|1.8814&nbsp;''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 176: 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>
बिल्ड-मैक्स-हीप फ़ंक्शन जो इसके बाद आता है, एक सरणी ''ए'' को परिवर्तित करता है जो संपूर्ण को संग्रहीत करता है
बार-बार बॉटम-अप तरीके से मैक्स-हीपिफ़ाई (अधिकतम-हीप के लिए डाउन-हीपिफ़ाई) का उपयोग करके अधिकतम-हीप में ''एन'' नोड्स के साथ बाइनरी ट्री।
सरणी तत्वों को अनुक्रमित किया गया
{{nowrap|''[[floor function|floor]]''(''n''/2) + 1}}, {{nowrap|''floor''(''n''/2) + 2}}, ..., एन
सभी पत्तियाँ पेड़ के लिए हैं (यह मानते हुए कि सूचकांक 1 से शुरू होते हैं) - इस प्रकार प्रत्येक एक-तत्व का ढेर है, और इसे नीचे-ढेर करने की आवश्यकता नहीं है। 'बिल्ड-मैक्स-हीप' चलता है
शेष वृक्ष नोड्स में से प्रत्येक पर 'मैक्स-हीपिफाई'।


'बिल्ड-मैक्स-हीप' ():
अतः इसके बाद आने वाला '''बिल्ड-मैक्स-हीप''' फलन, एक सरणी A को परिवर्तित करता है जो बार-बार '''अधिकतम-हीपिफ़ाई''' (अधिकतम-हीप के लिए निम्न-हीपिफ़ाई) का उपयोग करके उपरी विधि से n नोड के साथ एक पूर्ण बाइनरी ट्री को अधिकतम-हीप में संग्रहीत करता है। '''{{nowrap|''[[floor function|floor]]''(''n''/2) + 1}}''', '''{{nowrap|''floor''(''n''/2) + 2}}''', ..., द्वारा अनुक्रमित सरणी अवयव ट्री के सभी लेख हैं (यह मानते हुए कि सूचकांक 1 से प्रारम्भ होते हैं) - इस प्रकार प्रत्येक एक-अवयव का हीप है, और इसे नीचे-हीप करने की आवश्यकता नहीं है। '''बिल्ड-मैक्स-हीप''' शेष प्रत्येक ट्री नोड पर '''मैक्स-हीपिफाई''' चलाता है।
    'प्रत्येक सूचकांक के लिए' मैं 'से' मंजिल (लंबाई (ए)/2) 'नीचे' 1 'करें:'
        'मैक्स-हीपिफाई'(ए, आई)


== ढेर कार्यान्वयन ==<!-- This section is linked from [[Heapsort]] -->
'''Build-Max-Heap''' (''A''):
[[File:Binary tree in array.svg|right|frame|एक सरणी में संग्रहीत एक छोटा पूर्ण बाइनरी ट्री]]
  '''for each''' index ''i'' '''from''' ''floor''(''length''(''A'')/2) '''downto''' 1 '''do:'''
[[File:Binary Heap with Array Implementation.JPG|400px|thumb|right|बाइनरी हीप और सरणी कार्यान्वयन के बीच तुलना।]]हीप्स को आमतौर पर एक ऐरे डेटा संरचना के साथ कार्यान्वित किया जाता है। किसी भी बाइनरी ट्री को एक सरणी में संग्रहीत किया जा सकता है, लेकिन क्योंकि बाइनरी हीप हमेशा एक पूर्ण बाइनरी ट्री होता है, इसे कॉम्पैक्ट रूप से संग्रहीत किया जा सकता है। [[ सूचक (कंप्यूटर प्रोग्रामिंग) ]] के लिए किसी स्थान की आवश्यकता नहीं है; इसके बजाय, प्रत्येक नोड के माता-पिता और बच्चों को सरणी सूचकांकों पर अंकगणित द्वारा पाया जा सकता है। ये गुण इस ढेर कार्यान्वयन को एक अंतर्निहित डेटा संरचना या [[वंशावली]] सूची का एक सरल उदाहरण बनाते हैं। विवरण मूल स्थिति पर निर्भर करते हैं, जो बदले में कार्यान्वयन के लिए उपयोग की जाने वाली [[प्रोग्रामिंग भाषा]] की बाधाओं या प्रोग्रामर की प्राथमिकता पर निर्भर हो सकते हैं। विशेष रूप से, कभी-कभी अंकगणित को सरल बनाने के लिए मूल को सूचकांक 1 पर रखा जाता है।


मान लीजिए n ढेर में तत्वों की संख्या है और i ढेर को संग्रहीत करने वाले सरणी का एक मनमाना वैध सूचकांक है। यदि पेड़ की जड़ सूचकांक 0 पर है, वैध सूचकांक 0 से एन - 1 के साथ, तो सूचकांक i पर प्रत्येक तत्व a है
        '''Max-Heapify'''(''A'', ''i'')
* सूचकांक 2i + 1 और 2i + 2 पर बच्चे
* इंडेक्स [[फर्श समारोह]] पर इसका मूल ((i - 1) / 2)।
वैकल्पिक रूप से, यदि पेड़ की जड़ सूचकांक 1 पर है, वैध सूचकांक 1 से एन के साथ, तो सूचकांक i पर प्रत्येक तत्व a है
*सूचकांक 2i और 2i +1 पर बच्चे
* इंडेक्स फ़्लोर फ़ंक्शन (i/2) पर इसका मूल।


इस कार्यान्वयन का उपयोग हीप्सॉर्ट एल्गोरिदम में किया जाता है जो हीप को संग्रहीत करने के लिए इनपुट सरणी को आवंटित स्थान का पुन: उपयोग करता है (यानी एल्गोरिदम [[इन-प्लेस एल्गोरिदम]]|इन-प्लेस किया जाता है)। यह कार्यान्वयन प्राथमिकता कतार के रूप में भी उपयोगी है। जब एक [[गतिशील सरणी]] का उपयोग किया जाता है, तो असीमित संख्या में आइटमों का सम्मिलन संभव है। <code>upheap</code> ई>या <code>downheap</code> संचालन को एक सरणी के संदर्भ में निम्नानुसार बताया जा सकता है: मान लीजिए कि ढेर संपत्ति सूचकांक बी, बी + 1, ..., ई के लिए है। सिफ्ट-डाउन फ़ंक्शन हीप प्रॉपर्टी को b−1, b, b+1, ..., e तक बढ़ाता है।
== हीप कार्यान्वयन ==
केवल सूचकांक i = b−1 हीप संपत्ति का उल्लंघन कर सकता है।
[[File:Binary tree in array.svg|right|frame|एक सरणी में संग्रहीत छोटा पूर्ण बाइनरी ट्री]]
मान लें कि j श्रेणी b, ..., e के भीतर a[i] (अधिकतम-ढेर के लिए, या न्यूनतम-ढेर के लिए सबसे छोटे बच्चे) के सबसे बड़े बच्चे का सूचकांक है।
[[File:Binary Heap with Array Implementation.JPG|400px|thumb|right|बाइनरी हीप और सरणी कार्यान्वयन के बीच तुलना।]]इस प्रकार से हीप को सामान्यतः सरणी डेटा संरचना के साथ कार्यान्वित किया जाता है। किसी भी बाइनरी ट्री को सरणी में संग्रहीत किया जा सकता है, परन्तु क्योंकि बाइनरी हीप सदैव पूर्ण बाइनरी ट्री होता है, इसे संहत रूप से संग्रहीत किया जा सकता है। [[ सूचक (कंप्यूटर प्रोग्रामिंग) |सूचक (कंप्यूटर प्रोग्रामिंग)]] के लिए किसी स्थान की आवश्यकता नहीं है; इसके अतिरिक्त, प्रत्येक नोड के माता-पिता और चाइल्ड को सरणी सूचकांकों पर अंकगणित द्वारा पाया जा सकता है। ये गुण इस हीप कार्यान्वयन को अंतर्निहित डेटा संरचना या [[वंशावली]] सूची का सरल उदाहरण बनाते हैं। विवरण मूल स्थिति पर निर्भर करते हैं, जो इसके स्थान पर कार्यान्वयन के लिए उपयोग की जाने वाली [[प्रोग्रामिंग भाषा|प्रोग्रामिंग लैंग्वेज]] की बाधाओं या प्रोग्रामर की प्राथमिकता पर निर्भर हो सकते हैं। विशेष रूप से, कभी-कभी अंकगणित को सरल बनाने के लिए मूल को सूचकांक 1 पर रखा जाता है।
(यदि ऐसा कोई सूचकांक मौजूद नहीं है क्योंकि {{nowrap|2''i'' > ''e''}} तो ढेर संपत्ति नई विस्तारित सीमा के लिए बनी रहती है और कुछ भी करने की आवश्यकता नहीं होती है।)
a[i] और a[j] मानों की अदला-बदली करके स्थिति i के लिए हीप प्रॉपर्टी स्थापित की जाती है।
इस बिंदु पर, एकमात्र समस्या यह है कि ढेर संपत्ति सूचकांक जे के लिए मान्य नहीं हो सकती है।
सिफ्ट-डाउन फ़ंक्शन को [[ पूँछ प्रत्यावर्तन ]]|टेल-रिकर्सिव रूप से इंडेक्स जे पर तब तक लागू किया जाता है जब तक कि सभी तत्वों के लिए हीप प्रॉपर्टी स्थापित नहीं हो जाती।


सिफ्ट-डाउन फ़ंक्शन तेज़ है। प्रत्येक चरण में इसे केवल दो तुलनाओं और एक स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह काम कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम लॉग में<sub>2</sub> ई कदम आवश्यक हैं.
इस प्रकार से मान लीजिए n हीप में अवयवों की संख्या है और i हीप को संग्रहीत करने वाले सरणी का यादृच्छिक वैध सूचकांक है। यदि ट्री की रूट सूचकांक 0 पर है, वैध सूचकांक 0 से n - 1 के साथ, तो सूचकांक i पर प्रत्येक अवयव a है
* सूचकांक 2i + 1 और 2i + 2 पर चाइल्ड
* सूचकांक [[फर्श समारोह|फलक]] फलन पर इसका मूल ((i - 1) / 2)।
इस प्रकार से वैकल्पिक रूप से, यदि ट्री की रूट सूचकांक 1 पर है, वैध सूचकांक 1 से n के साथ, तो सूचकांक i पर प्रत्येक अवयव a है
*सूचकांक 2i और 2i +1 पर चाइल्ड
* सूचकांक [[फर्श समारोह|फलक]] फलन (i/2) पर इसका मूल।


बड़े ढेर और [[ आभासी मेमोरी ]] का उपयोग करने के लिए, उपरोक्त योजना के अनुसार तत्वों को एक सरणी में संग्रहीत करना अक्षम है: (लगभग) हर स्तर एक अलग पृष्ठ (कंप्यूटर मेमोरी) में है। [[ बी-ढेर ]]्स बाइनरी हीप्स हैं जो सबट्रीज़ को एक पेज में रखते हैं, जिससे एक्सेस किए गए पेजों की संख्या दस गुना तक कम हो जाती है।<ref>{{cite magazine|first = Poul-Henning|last= Kamp|url = http://queue.acm.org/detail.cfm?id=1814327 |title = आपके द्वारा गलत किया जा रहा है|magazine= ACM Queue|date = June 11, 2010|volume = 8|issue = 6}}
अतः इस कार्यान्वयन का उपयोग हीप सॉर्ट एल्गोरिदम में किया जाता है जो हीप को संग्रहीत करने के लिए इनपुट सरणी को आवंटित स्थान का पुन: उपयोग करता है (अर्थात एल्गोरिदम [[इन-प्लेस एल्गोरिदम]] किया जाता है)। यह कार्यान्वयन प्राथमिकता पंक्ति के रूप में भी उपयोगी है। जब [[गतिशील सरणी]] का उपयोग किया जाता है, तो असीमित संख्या में वस्तु का निवेशन संभव है।
 
<code>upheap</code> या <code>downheap</code> संचालन को सरणी के संदर्भ में निम्नानुसार बताया जा सकता है: मान लीजिए कि हीप गुण सूचकांक '''''b, b + 1, ..., e''''' के लिए है। सिफ्ट-निम्न फलन हीप गुण को '''''b−1, b, b+1, ..., e''''' तक बढ़ाता है। मात्र सूचकांक '''i = b−1''' हीप गुण का उल्लंघन कर सकता है।
 
मान लें कि '''j''' श्रेणी '''b, ..., e''' के भीतर '''a[i]''' (अधिकतम-हीप के लिए, या न्यूनतम-हीप के लिए सबसे छोटे चाइल्ड) के सबसे बड़े चाइल्ड का सूचकांक है। (यदि ऐसा कोई सूचकांक स्थित नहीं है क्योंकि '''{{nowrap|2''i'' > ''e''}}''' तो हीप गुण नवीन विस्तारित सीमा के लिए बनी रहती है और कुछ भी करने की आवश्यकता नहीं होती है।) '''a[i]''' और '''a[j]''' मानों की गमागमन करके स्थिति i के लिए हीप गुण स्थापित की जाती है। इस बिंदु पर, एकमात्र समस्या यह है कि हीप गुण सूचकांक '''j''' के लिए मान्य नहीं हो सकती है।सिफ्ट-निम्न फलन को [[ पूँछ प्रत्यावर्तन |पश्च प्रत्यावर्तन]] रूप से सूचकांक '''j''' पर तब तक लागू किया जाता है जब तक कि सभी अवयवों के लिए हीप गुण स्थापित नहीं हो जाती है।
 
इस प्रकार से सिफ्ट-निम्न फलन तीव्र है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह कार्य कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम log<sub>2</sub> ''e'' चरण आवश्यक हैं।
 
अतः बड़े हीप और [[ आभासी मेमोरी |आभासी मेमोरी]] का उपयोग करने के लिए, उपरोक्त योजना के अनुसार अवयवों को सरणी में संग्रहीत करना अक्षम है: (लगभग) प्रत्येक स्तर अलग पृष्ठ (कंप्यूटर मेमोरी) में है। [[ बी-ढेर |बी-हीप]] बाइनरी हीप हैं जो उपट्री को पृष्ठ में रखते हैं, जिससे अभिगामित किए गए पृष्ठों की संख्या दस गुना तक कम हो जाती है।<ref>{{cite magazine|first = Poul-Henning|last= Kamp|url = http://queue.acm.org/detail.cfm?id=1814327 |title = आपके द्वारा गलत किया जा रहा है|magazine= ACM Queue|date = June 11, 2010|volume = 8|issue = 6}}
</ref>
</ref>
दो बाइनरी ढेरों को मर्ज करने की प्रक्रिया समान आकार के ढेरों के लिए Θ(n) लेती है। सबसे अच्छा आप जो कर सकते हैं वह है (सरणी कार्यान्वयन के मामले में) बस दो ढेर सारणियों को जोड़ना और परिणाम का ढेर बनाना।<ref>Chris L. Kuszmaul.
 
इस प्रकार से दो बाइनरी हीप को मर्ज करने की प्रक्रिया समान आकार के हीप के लिए '''Θ(n)''' लेती है। सबसे ठीक आप जो कर सकते हैं वह है (सरणी कार्यान्वयन के स्थिति में) मात्र दो हीप सरणियों को जोड़ना और परिणाम का हीप बनाना।<ref>Chris L. Kuszmaul.
[http://nist.gov/dads/HTML/binaryheap.html "binary heap"] {{Webarchive| url=https://web.archive.org/web/20080808141408/http://www.nist.gov/dads/HTML/binaryheap.html |date=2008-08-08 }}.
[http://nist.gov/dads/HTML/binaryheap.html "binary heap"] {{Webarchive| url=https://web.archive.org/web/20080808141408/http://www.nist.gov/dads/HTML/binaryheap.html |date=2008-08-08 }}.
Dictionary of Algorithms and Data Structures, Paul E. Black, ed., U.S. National Institute of Standards and Technology. 16 November 2009.</ref> एन तत्वों पर एक ढेर को (लॉग एन लॉग के) कुंजी तुलनाओं का उपयोग करके, या पॉइंटर-आधारित कार्यान्वयन के मामले में, (लॉग एन लॉग के) समय में, के तत्वों पर ढेर के साथ विलय किया जा सकता है।<ref>J.-R. Sack and T. Strothotte
Dictionary of Algorithms and Data Structures, Paul E. Black, ed., U.S. National Institute of Standards and Technology. 16 November 2009.</ref> n अवयवों पर हीप को '''O(log ''n'' log ''k'')''' कुंजी तुलनाओं का उपयोग करके, या पॉइंटर-आधारित कार्यान्वयन के स्थिति में, '''O(log n log k)''' समय में, के अवयवों पर हीप के साथ मर्ज किया जा सकता है।<ref>J.-R. Sack and T. Strothotte
[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)''''' तुलना की आवश्यकता होती है। यह दृश्य हीप के मर्ज के लिए नवीन और वैचारिक रूप से सरल एल्गोरिदम भी प्रस्तुत करता है। जब मर्ज सामान्य कार्य है, तो अलग हीप कार्यान्वयन की संस्तुति की जाती है, जैसे [[द्विपद ढेर|द्विपद]] हीप, जिसे '''O(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) तुलना की आवश्यकता होती है। यह दृश्य ढेरों के विलय के लिए एक नया और वैचारिक रूप से सरल एल्गोरिदम भी प्रस्तुत करता है। जब विलय एक सामान्य कार्य है, तो एक अलग ढेर कार्यान्वयन की सिफारिश की जाती है, जैसे [[द्विपद ढेर]], जिसे (लॉग एन) में विलय किया जा सकता है।


इसके अतिरिक्त, एक बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, लेकिन तत्व जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न तत्व को खोजने में एक समस्या होती है। इस तत्व को एल्गोरिदमिक रूप से या नोड्स में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - केवल बच्चों के संदर्भों को संग्रहीत करने के बजाय, हम नोड के [[क्रम में]] उत्तराधिकारी को भी संग्रहीत करते हैं।
इस प्रकार से इसके अतिरिक्त, बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, परन्तु अवयव जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न अवयव को खोजने में समस्या होती है। इस अवयव को एल्गोरिदमिक रूप से या नोड में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - मात्र चाइल्ड के संदर्भों को संग्रहीत करने के अतिरिक्त, हम नोड के [[क्रम में]] उत्तराधिकारी को भी संग्रहीत करते हैं।


बिग ओ नोटेशन में सबसे छोटे और सबसे बड़े दोनों तत्वों के निष्कर्षण को संभव बनाने के लिए ढेर संरचना को संशोधित करना संभव है|<math>O</math><math>(\log n)</math> समय।<ref name="sym">{{cite web
अतः <math>O</math><math>(\log n)</math> समय में सबसे छोटे और सबसे बड़े दोनों अवयवों के निष्कर्षण को संभव बनाने के लिए हीप संरचना को संशोधित करना संभव है।<ref name="sym">{{cite web
| url = http://cg.scs.carleton.ca/~morin/teaching/5408/refs/minmax.pdf
| url = http://cg.scs.carleton.ca/~morin/teaching/5408/refs/minmax.pdf
| author = Atkinson, M.D.
| author = Atkinson, M.D.
Line 230: Line 239:
| publisher = Programming techniques and Data structures. Comm. ACM, 29(10): 996–1000
| publisher = Programming techniques and Data structures. Comm. ACM, 29(10): 996–1000
| date = 1 October 1986
| date = 1 October 1986
}}</ref> ऐसा करने के लिए, पंक्तियाँ न्यूनतम ढेर और अधिकतम ढेर के बीच वैकल्पिक होती हैं। एल्गोरिदम लगभग समान हैं, लेकिन, प्रत्येक चरण में, वैकल्पिक तुलनाओं के साथ वैकल्पिक पंक्तियों पर विचार करना चाहिए। प्रदर्शन लगभग सामान्य एकल दिशा ढेर के समान है। इस विचार को न्यूनतम-अधिकतम-मध्यम ढेर तक सामान्यीकृत किया जा सकता है।
}}</ref> ऐसा करने के लिए, पंक्तियाँ न्यूनतम हीप और अधिकतम हीप के बीच वैकल्पिक होती हैं। एल्गोरिदम लगभग समान हैं, परन्तु, प्रत्येक चरण में, वैकल्पिक तुलनाओं के साथ वैकल्पिक पंक्तियों पर विचार करना चाहिए। निष्पादन लगभग सामान्य एकल दिशा हीप के समान है। इस विचार को न्यूनतम-अधिकतम-मध्यम हीप तक सामान्यीकृत किया जा सकता है।


==सूचकांक समीकरणों की व्युत्पत्ति==
==सूचकांक समीकरणों की व्युत्पत्ति==
एक सरणी-आधारित ढेर में, नोड के बच्चों और माता-पिता को नोड के सूचकांक पर सरल अंकगणित के माध्यम से स्थित किया जा सकता है। यह खंड सूचकांक 0 पर जड़ वाले ढेरों के लिए प्रासंगिक समीकरण प्राप्त करता है, सूचकांक 1 पर जड़ वाले ढेरों पर अतिरिक्त नोट्स के साथ।
इस प्रकार से एक सरणी-आधारित हीप में, नोड के चाइल्ड और माता-पिता को नोड के सूचकांक पर सरल अंकगणित के माध्यम से स्थित किया जा सकता है। अतः यह खंड सूचकांक 0 पर रूट वाले हीप के लिए प्रासंगिक समीकरण प्राप्त करता है, सूचकांक 1 पर रूट वाले हीप पर अतिरिक्त सूचना के साथ है।


भ्रम से बचने के लिए, हम नोड के स्तर को जड़ से उसकी दूरी के रूप में परिभाषित करेंगे, जैसे कि जड़ स्वयं स्तर 0 पर हो।
इस प्रकार से भ्रम से बचने के लिए, हम नोड के स्तर को रूट से उसकी दूरी के रूप में परिभाषित करेंगे, जैसे कि रूट स्वयं स्तर 0 पर हो।


=== चाइल्ड नोड्स ===
=== चाइल्ड नोड ===


सूचकांक पर स्थित एक सामान्य नोड के लिए {{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}}वें नोड को इंडेक्स पर संग्रहीत किया जाएगा <math>(k - 1)</math>. इन अवलोकनों को एक साथ रखने पर परत में अंतिम नोड के सूचकांक के लिए निम्नलिखित अभिव्यक्ति प्राप्त होती है {{mvar|l}}.
मान लीजिए कि नोड {{mvar|i}} स्तर {{mvar|L}} में स्थित है, और ध्यान दें कि किसी भी स्तर '''''l''''' में निश्चित <math>2^l</math> नोड होते हैं। इसके अतिरिक्त, परत l तक की परतों में निश्चित <math>2^{l + 1} - 1</math> नोड समाहित हैं (बाइनरी अंकगणित के विषय में सोचें; 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>
उसको रहनो दो {{mvar|j}} नोड के बाद नोड {{mvar|i}} परत L में, ऐसा कि
मान लीजिए कि परत L में नोड {{mvar|i}} के बाद {{mvar|j}} नोड हैं, जैसे कि


::<math>\begin{alignat}{2}
::<math>\begin{alignat}{2}
Line 251: Line 260:
\end{alignat}
\end{alignat}
</math>
</math>
इनमें से प्रत्येक {{mvar|j}} नोड्स में बिल्कुल 2 बच्चे होने चाहिए, इसलिए होना ही चाहिए <math>2j</math> नोड्स को अलग करना {{mvar|i}} इसकी परत के अंत से दायाँ बच्चा (<math>L + 1</math>).
इस प्रकार से इनमें से प्रत्येक {{mvar|j}} नोड में ठीक 2 चाइल्ड होने चाहिए, इसलिए {{mvar|i}} के दाएं चाइल्ड को उसकी परत (<math>L + 1</math>) के अंत से अलग करने वाले <math>2j</math> नोड होने चाहिए।


::<math>\begin{alignat}{2}
::<math>\begin{alignat}{2}
Line 262: Line 271:
आवश्यकता अनुसार।
आवश्यकता अनुसार।


यह देखते हुए कि किसी भी नोड का बायां बच्चा हमेशा उसके दाएं बच्चे से 1 स्थान पहले होता है, हमें मिलता है <math>\text{left} = 2i + 1</math>.
अतः यह देखते हुए कि किसी भी नोड का बायां चाइल्ड सदैव उसके दाएं चाइल्ड से 1 स्थान पहले होता है, हमें <math>\text{left} = 2i + 1</math> मिलता है।


यदि रूट 0 के बजाय इंडेक्स 1 पर स्थित है, तो प्रत्येक स्तर में अंतिम नोड इंडेक्स पर है <math>2^{l + 1} - 1</math>. इसका प्रयोग सम्पूर्ण पैदावार में करें <math>\text{left} = 2i</math> और <math>\text{right} = 2i + 1</math> उन ढेरों के लिए जिनकी जड़ 1 है।
यदि रूट 0 के अतिरिक्त सूचकांक 1 पर स्थित है, तो प्रत्येक स्तर में अंतिम नोड सूचकांक <math>2^{l + 1} - 1</math> पर है। इसका उपयोग करने से हीप के लिए <math>\text{left} = 2i</math> और <math>\text{right} = 2i + 1</math> प्राप्त होता है जिनकी रूट 1 है।


=== मूल नोड ===
=== मूल नोड ===


प्रत्येक नोड या तो अपने माता-पिता का बायाँ या दायाँ बच्चा है, इसलिए हम जानते हैं कि निम्नलिखित में से कोई भी सत्य है।
इस प्रकार से प्रत्येक नोड या तो अपने माता-पिता का बायाँ या दायाँ चाइल्ड है, इसलिए हम जानते हैं कि निम्नलिखित में से कोई भी सत्य है।


# <math>i = 2 \times (\text{parent}) + 1</math>
# <math>i = 2 \times (\text{parent}) + 1</math>
# <math>i = 2 \times (\text{parent}) + 2</math>
# <math>i = 2 \times (\text{parent}) + 2</math>
इस तरह,
इस प्रकार,
::<math>\text{parent} = \frac{i - 1}{2} \;\textrm{ or }\; \frac{i - 2}{2}</math>
::<math>\text{parent} = \frac{i - 1}{2} \;\textrm{ or }\; \frac{i - 2}{2}</math>
अब अभिव्यक्ति पर विचार करें <math>\left\lfloor \dfrac{i - 1}{2} \right\rfloor</math>.
अब अभिव्यक्ति <math>\left\lfloor \dfrac{i - 1}{2} \right\rfloor</math> पर विचार करें।


यदि नोड <math>i</math> यदि कोई बायाँ बच्चा है, तो यह तुरंत परिणाम देता है, हालाँकि, यदि नोड है तो यह सही परिणाम भी देता है <math>i</math> एक सही बच्चा है. इस मामले में, <math>(i - 2)</math> सम होना चाहिए, और इसलिए <math>(i - 1)</math> अजीब होना चाहिए.
यदि नोड <math>i</math> बायाँ चाइल्ड है, तो यह तुरंत परिणाम देता है, यद्यपि, यदि नोड <math>i</math> दायाँ चाइल्ड है तो यह उचित परिणाम भी देता है। इस स्थिति में, <math>(i - 2)</math> सम होना चाहिए, और इसलिए <math>(i - 1)</math> विषम होना चाहिए।


::<math>\begin{alignat}{2}
::<math>\begin{alignat}{2}
Line 284: Line 293:
\end{alignat}
\end{alignat}
</math>
</math>
इसलिए, चाहे कोई नोड बायां या दायां बच्चा हो, उसके माता-पिता को अभिव्यक्ति द्वारा पाया जा सकता है:
इसलिए, चाहे कोई नोड बायां या दायां चाइल्ड हो, उसके माता-पिता को अभिव्यक्ति द्वारा पाया जा सकता है:


::<math>\text{parent} = \left\lfloor \dfrac{i - 1}{2} \right\rfloor</math>
::<math>\text{parent} = \left\lfloor \dfrac{i - 1}{2} \right\rfloor</math>
==संबंधित संरचनाएं==
==संबंधित संरचनाएं==
चूँकि ढेर में भाई-बहनों का क्रम ढेर संपत्ति द्वारा निर्दिष्ट नहीं किया जाता है, एक एकल नोड के दो बच्चों को स्वतंत्र रूप से तब तक बदला जा सकता है जब तक कि ऐसा करने से आकार संपत्ति का उल्लंघन न हो ([[फँसाना]] के साथ तुलना करें)। हालाँकि, ध्यान दें कि सामान्य सरणी-आधारित हीप में, केवल बच्चों की अदला-बदली करने से हीप संपत्ति को बनाए रखने के लिए बच्चों के उप-वृक्ष नोड्स को स्थानांतरित करने की भी आवश्यकता हो सकती है।
चूँकि हीप में भाई-बहनों का क्रम हीप गुण द्वारा निर्दिष्ट नहीं किया जाता है, एकल नोड के दो चाइल्ड को स्वतंत्र रूप से तब तक बदला जा सकता है जब तक कि ऐसा करने से आकार गुण का उल्लंघन न हो (ट्रीप के साथ तुलना करें)। यद्यपि, ध्यान दें कि सामान्य सरणी-आधारित हीप में, मात्र चाइल्ड की गमागमन करने से हीप गुण को बनाए रखने के लिए चाइल्ड के उप-ट्री नोड को स्थानांतरित करने की भी आवश्यकता हो सकती है।


बाइनरी हीप [[डी-एरी ढेर]] का एक विशेष मामला है जिसमें डी = 2 है।
इस प्रकार से बाइनरी हीप [[डी-एरी ढेर|डी-एरी]] हीप का विशेष स्थिति है जिसमें d = 2 है।


==चलने के समय का सारांश==
==चलने के समय का सारांश==
Line 298: Line 305:


==यह भी देखें==
==यह भी देखें==
* ढेर (डेटा संरचना)
* हीप (डेटा संरचना)
* ढेर बनाएं और छांटें
* हीप बनाएं और छांटें


==संदर्भ==
==संदर्भ==
{{reflist}}
{{reflist}}


==बाहरी संबंध==
==बाहरी संबंध==
Line 312: Line 318:
{{Data structures}}
{{Data structures}}


{{DEFAULTSORT:Binary Heap}}[[Category: ढेर (डेटा संरचनाएं)]] [[Category: बाइनरी पेड़]]
{{DEFAULTSORT:Binary Heap}}
 
 


[[Category: Machine Translated Page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 07/07/2023]]
[[Category:Citation Style 1 templates|M]]
[[Category:Collapse templates|Binary Heap]]
[[Category:Created On 07/07/2023|Binary Heap]]
[[Category:Lua-based templates|Binary Heap]]
[[Category:Machine Translated Page|Binary Heap]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Binary Heap]]
[[Category:Pages with script errors|Binary Heap]]
[[Category:Short description with empty Wikidata description|Binary Heap]]
[[Category:Sidebars with styles needing conversion|Binary Heap]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Binary Heap]]
[[Category:Templates based on the Citation/CS1 Lua module]]
[[Category:Templates generating COinS|Cite magazine]]
[[Category:Templates generating microformats|Binary Heap]]
[[Category:Templates that add a tracking category|Binary Heap]]
[[Category:Templates that are not mobile friendly|Binary Heap]]
[[Category:Templates that generate short descriptions|Binary Heap]]
[[Category:Templates using TemplateData|Binary Heap]]
[[Category:Webarchive template wayback links]]
[[Category:Wikipedia fully protected templates|Cite magazine]]
[[Category:Wikipedia metatemplates|Binary Heap]]

Latest revision as of 09:36, 27 July 2023

Binary (min) heap
Typebinary tree/heap
Invented1964
Invented byJ. W. J. Williams
Time complexity in big O notation
Algorithm Average Worst case
Space O(n) O(n)
Search O(n) O(n)
Insert O(1) O(log n)
Find-min O(1) O(1)
Delete-min O(log n) O(log n)
संपूर्ण बाइनरीअधिकतम-हीप का उदाहरण
संपूर्ण बाइनरी लघु हीप का उदाहरण

बाइनरी हीप (डेटा संरचना) डेटा संरचना है जो द्विआधारी ट्री का रूप लेती है। बाइनरी हीप प्राथमिकता पंक्ति को लागू करने की सामान्य विधि है।[1]: 162–163  बाइनरी हीप को 1964 में जे.डब्ल्यू.जे. विलियम्स द्वारा 1964 में हीपसॉर्ट के लिए डेटा संरचना के रूप में प्रस्तुत किया गया था।[2]

इस प्रकार से एक बाइनरी हीप को दो अतिरिक्त बाधाओं के साथ बाइनरी ट्री के रूप में परिभाषित किया गया है:[3]

  • आकार गुण: बाइनरी हीप पूर्ण बाइनरी ट्री है; अर्थात, संभवतः अंतिम (सबसे गहन) को छोड़कर, ट्री के सभी स्तर पूर्ण रूप से भरे हुए हैं, और, यदि ट्री का अंतिम स्तर पूर्ण नहीं हुआ है, तो उस स्तर के नोड बाएं से दाएं भरे हुए हैं।
  • हीप गुण: कुछ कुल क्रम के अनुसार, प्रत्येक नोड में संग्रहीत कुंजी या तो (≥) से अधिक या उसके बराबर है या नोड के चाइल्ड में कुंजी से कम या (≤) के बराबर है।

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

हीप परिचालन

इस प्रकार से सम्मिलित करने और हटाने के दोनों परिचालन पहले हीप के अंत से जोड़कर या हटाकर, आकार गुण के अनुरूप हीप को संशोधित करते हैं। फिर हीप की गुण को हीप के अप या नीचे जाकर पुनः स्थापित किया जाता है। दोनों परिचालन में O(log n) समय लगता है।

निवेशन

इस प्रकार से हीप में अवयव जोड़ने के लिए, हम यह एल्गोरिदम निष्पादित कर सकते हैं:

  1. अवयव को सबसे बाईं ओर संवृत स्थान पर हीप के निम्न स्तर पर जोड़ें।
  2. जोड़े गए अवयव की उसके मूल अवयव से तुलना करें; यदि वे उचित क्रम में हैं, तो रुकें।
  3. यदि नहीं, तो अवयव को उसके मूल अवयव से बदलें और पूर्व चरण पर वापस लौटें।

अतः चरण 2 और 3, जो नोड की उसके मूल के साथ तुलना और संभवतः गमागमन करके हीप गुण को पुनः स्थापित करते हैं, अपहीप परिचालन कहलाते हैं (बबल-अप, परकोलेट-अप, सिफ्ट-अप, ट्रिकल-अप, स्विम-अप, हीपफाई-अप या कैस्केड-अप के रूप में भी जाना जाता है)।

आवश्यक संचालन की संख्या मात्र उन स्तरों की संख्या पर निर्भर करती है जो नवीन अवयव को हीप गुण को संतुष्ट करने के लिए बढ़ाना चाहिए। इस प्रकार, निवेशन परिचालन में O(log n) की सबसे निकृष्ट स्थिति वाली समय जटिलता होती है। यादृच्छिक हीप के लिए, और बार-बार निवेशन के लिए, निवेशन परिचालन में O(1) की औसत-केस जटिलता होती है।[4][5]

इस प्रकार से बाइनरी हीप निवेशन के उदाहरण के रूप में, मान लें कि हमारे गुण अधिकतम-हीप

Heap add step1.svg
है और हम हीप में संख्या 15 जोड़ना चाहते हैं। हम पहले 15 को एक्स द्वारा चिह्नित स्थान पर रखते हैं। यद्यपि, हीप गुण का उल्लंघन 15 > 8 से हुआ है, इसलिए हमें 15 और 8 को स्वैप करने की आवश्यकता है। इसलिए, पहले स्वैप के बाद हमारे गुण हीप इस प्रकार दिख रहा है:
Heap add step2.svg
यद्यपि हीप गुण का अभी भी उल्लंघन किया जा रहा है 15 > 11, इसलिए हमें फिर से स्वैप करने की आवश्यकता है:
Heap add step3.svg
इस प्रकार से जो वैध अधिकतम-हीप है। इस अंतिम चरण के बाद बाएं चाइल्ड की जांच करने की कोई आवश्यकता नहीं है: प्रारम्भ में, अधिकतम-हीप वैध था, जिसका अर्थ है कि रूट पहले से ही अपने बाएं चाइल्ड से बड़ा था, इसलिए रूट को और भी अधिक मान के साथ बदलने से वह गुण बनी रहेगी प्रत्येक नोड अपने चाइल्ड से बड़ा है (11 > 5; यदि 15 > 11, और 11 > 5, तो सकर्मक संबंध के कारण 15 > 5, )।

निष्कर्षण

हीप गुण को बनाए रखते हुए हीप से रूट को हटाने की प्रक्रिया (अधिकतम-हीप में अधिकतम अवयव या न्यूनतम-हीप में न्यूनतम अवयव को प्रभावी रूप से निकालना) इस प्रकार है:

  1. हीप की रूट को अंतिम स्तर पर अंतिम अवयव से बदलें।
  2. नवीन रूट की तुलना उसके चाइल्ड से करें; यदि वे उचित क्रम में हैं, तो रुकें।
  3. यदि नहीं, तो अवयव को उसके किसी चाइल्ड के साथ बदलें और पूर्व चरण पर वापस लौटें। (लघु-हीप में इसके छोटे चाइल्ड और उच्च-हीप में इसके बड़े चाइल्ड के साथ स्वैप करें।)

चरण 2 और 3, जो एक नोड की उसके चाइल्ड में से किसी एक के साथ तुलना करके और संभवतः स्वैप करके हीप गुण को पुनर्स्थापित करते हैं, निम्न-हीप (बबल-निम्न, परकोलेट-निम्न, सिफ्ट-निम्न, सिंक-निम्न, ट्रिकल निम्न, हीपफाई-निम्न, कैस्केड-निम्न, निष्कर्षण-लघु या एक्सट्रैक्ट-मैक्स, या मात्र हीपफाई के रूप में भी जाना जाता है) परिचालन कहलाते हैं।

इसलिए, यदि हमारे गुण पहले जैसा ही अधिकतम-हीप है

Heap delete step0.svg
हम 11 को हटाते हैं और इसे 4 से प्रतिस्थापित करते हैं।
Heap remove step1.svg
इस प्रकार से अब हीप गुण का उल्लंघन हो गया है क्योंकि 8, 4 से बड़ा है। इस स्थिति में, दो अवयवों, 4 और 8 की गमागमन, हीप गुण को पुनः स्थापित करने के लिए पर्याप्त है और हमें आगे अवयवों की गमागमन करने की आवश्यकता नहीं है:
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
    largesti
    
    if leftlength(A) and A[left] > A[largest] then:
        largestleft
if rightlength(A) and A[right] > A[largest] then:
        largestright
    
    if largesti then:
        swap A[i] and A[largest]
        Max-Heapify(A, largest)

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

सबसे निकृष्ट स्थिति में, नवीन रूट को प्रत्येक स्तर पर अपने चाइल्ड के साथ तब तक स्वैप करना पड़ता है जब तक कि यह हीप के निम्न स्तर तक नहीं पहुंच जाता है, जिसका अर्थ है कि डिलीट परिचालन में ट्री की ऊंचाई के सापेक्ष समय जटिलता है, या O(log n)।

निवेशन फिर निष्कर्षण

अतः किसी अवयव को सम्मिलित करना और फिर हीप से निकालना अप परिभाषित निवेशन और निष्कर्षण संक्रिया को कॉल करने की तुलना में अधिक कुशलता से किया जा सकता है, जिसमें दोनों upheap और downheap संक्रिया सम्मिलित होंगे। इस प्रकार से इसके अतिरिक्त, हम मात्र downheap परिचालन कर सकते हैं, इस प्रकार है:

  1. तुलना करें कि क्या हम जिस वस्तु को आगे बढ़ा रहे हैं या हीप के शीर्ष पर झांक रहा है वह बड़ा है (अधिकतम हीप मानते हुए)।
  2. यदि हीप की रूट बड़ी हो:
    1. रूट को नवीन वस्तु से बदलें।
    2. रूट से प्रारम्भ करके निम्न-हीपिफाई करना।
  3. अन्यथा, वह वस्तु वापस कर दें जिसे हम आगे बढ़ा रहे हैं।

इस प्रकार से पायथन (प्रोग्रामिंग लैंग्वेज) निवेशन और फिर निष्कर्षण के लिए हीपपुशपॉप नामक ऐसा फलन प्रदान करता है, जिसे नीचे संक्षेप में प्रस्तुत किया गया है।[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) समय लगता है।

विलोप

इस प्रकार से किसी यादृच्छिक अवयव को हटाना इस प्रकार किया जा सकता है:

  1. जिस अवयव को हम हटाना चाहते हैं उसका सूचकांक ढूंढें।
  2. इस अवयव को अंतिम अवयव से बदलें।
  3. हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई या अपहीपिफाई करें। अधिकतम-हीप (न्यूनतम-हीप) में, अपहीपिफ़ाइ की आवश्यकता मात्र तब होती है जब अवयव की नवीन कुंजी होती है पूर्व वाले से बड़ा (छोटा) है क्योंकि मात्र मूल अवयव की हीप-गुण का उल्लंघन हो सकता है। यह मानते हुए कि हीप-गुण अवयव के बीच मान्य थी और अवयव स्वैप से पहले उसके चाइल्ड, अब बड़े (छोटे) कुंजी मान द्वारा इसका उल्लंघन नहीं किया जा सकता है। जब नवीन कुंजी पूर्व कुंजी से कम (अधिक) होती है तो मात्र निम्न-हीपिफाई की आवश्यकता होती है क्योंकि हीप-गुण का उल्लंघन मात्र चाइल्ड अवयवों में ही हो सकता है।

न्यूनता या वृद्धि कुंजी

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

इस प्रकार से न्यूनता कुंजी इस प्रकार की जा सकती है:

  1. उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं।
  2. नोड का मान घटाएं।
  3. हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई (अधिकतम हीप मानकर)।

इस प्रकार से कुंजी को इस प्रकार बढ़ाया जा सकता है:

  1. उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं।
  2. नोड का मान बढ़ाएँ।
  3. हीप गुण को पुनर्स्थापित करने के लिए अप-हीपिफाइ (अधिकतम हीप मानकर)।

हीप बनाना

इस प्रकार से n इनपुट अवयवों की एक सरणी से एक हीप का निर्माण एक रिक्त हीप से प्रारम्भ करके, फिर क्रमिक रूप से प्रत्येक अवयव को सम्मिलित करके किया जा सकता है। यह दृष्टिकोण, जिसे बाइनरी हीप के आविष्कारक के नाम पर विलियम्स विधि कहा जाता है, सरलता से O(n log n) समय में चलता हुआ देखा जाता है: यह प्रत्येक O(log n) लागत पर n निवेशन करता है।[lower-alpha 1]

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

यह इस तथ्य का उपयोग करता है कि दी गई अनंत श्रृंखला (गणित) अभिसरण श्रृंखला है।

इस प्रकार से उपरोक्त का यथार्थ मान (हीप निर्माण के समय तुलना की सबसे निकृष्ट स्थिति वाली संख्या) इसके बराबर माना जाता है:

,[9][lower-alpha 2]

जहाँ s2(n) बाइनरी प्रतिनिधित्व के सभी अंकों का योग n है और e2(n) का प्रतिपादक 2 है, जो n के अभाज्य गुणनखंडन में है।

औसत स्थिति का विश्लेषण करना अधिक जटिल है, परन्तु इसे स्पर्शोन्मुख दृष्टिकोण 1.8814 n − 2 log2n + O(1) तुलना से दिखाया जा सकता है।[10][11]

अतः इसके बाद आने वाला बिल्ड-मैक्स-हीप फलन, एक सरणी A को परिवर्तित करता है जो बार-बार अधिकतम-हीपिफ़ाई (अधिकतम-हीप के लिए निम्न-हीपिफ़ाई) का उपयोग करके उपरी विधि से n नोड के साथ एक पूर्ण बाइनरी ट्री को अधिकतम-हीप में संग्रहीत करता है। floor(n/2) + 1, floor(n/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 से n - 1 के साथ, तो सूचकांक i पर प्रत्येक अवयव a है

  • सूचकांक 2i + 1 और 2i + 2 पर चाइल्ड
  • सूचकांक फलक फलन पर इसका मूल ((i - 1) / 2)।

इस प्रकार से वैकल्पिक रूप से, यदि ट्री की रूट सूचकांक 1 पर है, वैध सूचकांक 1 से n के साथ, तो सूचकांक 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 पर तब तक लागू किया जाता है जब तक कि सभी अवयवों के लिए हीप गुण स्थापित नहीं हो जाती है।

इस प्रकार से सिफ्ट-निम्न फलन तीव्र है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह कार्य कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम log2 e चरण आवश्यक हैं।

अतः बड़े हीप और आभासी मेमोरी का उपयोग करने के लिए, उपरोक्त योजना के अनुसार अवयवों को सरणी में संग्रहीत करना अक्षम है: (लगभग) प्रत्येक स्तर अलग पृष्ठ (कंप्यूटर मेमोरी) में है। बी-हीप बाइनरी हीप हैं जो उपट्री को पृष्ठ में रखते हैं, जिससे अभिगामित किए गए पृष्ठों की संख्या दस गुना तक कम हो जाती है।[12]

इस प्रकार से दो बाइनरी हीप को मर्ज करने की प्रक्रिया समान आकार के हीप के लिए Θ(n) लेती है। सबसे ठीक आप जो कर सकते हैं वह है (सरणी कार्यान्वयन के स्थिति में) मात्र दो हीप सरणियों को जोड़ना और परिणाम का हीप बनाना।[13] n अवयवों पर हीप को O(log n log k) कुंजी तुलनाओं का उपयोग करके, या पॉइंटर-आधारित कार्यान्वयन के स्थिति में, O(log n log k) समय में, के अवयवों पर हीप के साथ मर्ज किया जा सकता है।[14] नवीन दृश्य के आधार पर, n अवयवों पर हीप को क्रमशः k और n-k अवयवों पर दो हीप में विभाजित करने के लिए एल्गोरिदम उप-हीप के क्रमबद्ध संग्रह के रूप में हीप को प्रस्तुत किया गया था।[15] एल्गोरिदम को O(log n * log n) तुलना की आवश्यकता होती है। यह दृश्य हीप के मर्ज के लिए नवीन और वैचारिक रूप से सरल एल्गोरिदम भी प्रस्तुत करता है। जब मर्ज सामान्य कार्य है, तो अलग हीप कार्यान्वयन की संस्तुति की जाती है, जैसे द्विपद हीप, जिसे O(log n) में मर्ज किया जा सकता है।

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

अतः समय में सबसे छोटे और सबसे बड़े दोनों अवयवों के निष्कर्षण को संभव बनाने के लिए हीप संरचना को संशोधित करना संभव है।[16] ऐसा करने के लिए, पंक्तियाँ न्यूनतम हीप और अधिकतम हीप के बीच वैकल्पिक होती हैं। एल्गोरिदम लगभग समान हैं, परन्तु, प्रत्येक चरण में, वैकल्पिक तुलनाओं के साथ वैकल्पिक पंक्तियों पर विचार करना चाहिए। निष्पादन लगभग सामान्य एकल दिशा हीप के समान है। इस विचार को न्यूनतम-अधिकतम-मध्यम हीप तक सामान्यीकृत किया जा सकता है।

सूचकांक समीकरणों की व्युत्पत्ति

इस प्रकार से एक सरणी-आधारित हीप में, नोड के चाइल्ड और माता-पिता को नोड के सूचकांक पर सरल अंकगणित के माध्यम से स्थित किया जा सकता है। अतः यह खंड सूचकांक 0 पर रूट वाले हीप के लिए प्रासंगिक समीकरण प्राप्त करता है, सूचकांक 1 पर रूट वाले हीप पर अतिरिक्त सूचना के साथ है।

इस प्रकार से भ्रम से बचने के लिए, हम नोड के स्तर को रूट से उसकी दूरी के रूप में परिभाषित करेंगे, जैसे कि रूट स्वयं स्तर 0 पर हो।

चाइल्ड नोड

अतः सूचकांक पर स्थित सामान्य नोड i के लिए (0 से प्रारम्भ करके), हम पहले इसके दाएं चाइल्ड, का सूचकांक प्राप्त करेंगे।

मान लीजिए कि नोड i स्तर L में स्थित है, और ध्यान दें कि किसी भी स्तर l में निश्चित नोड होते हैं। इसके अतिरिक्त, परत l तक की परतों में निश्चित नोड समाहित हैं (बाइनरी अंकगणित के विषय में सोचें; 0111...111 = 1000...000 - 1)। क्योंकि रूट 0 पर संग्रहित है, kवें नोड सूचकांक पर संग्रहीत किया जाएगा। इन अवलोकनों को साथ रखने पर परत l में अंतिम नोड के सूचकांक के लिए निम्नलिखित अभिव्यक्ति प्राप्त होती है।

मान लीजिए कि परत L में नोड i के बाद j नोड हैं, जैसे कि

इस प्रकार से इनमें से प्रत्येक j नोड में ठीक 2 चाइल्ड होने चाहिए, इसलिए i के दाएं चाइल्ड को उसकी परत () के अंत से अलग करने वाले नोड होने चाहिए।

आवश्यकता अनुसार।

अतः यह देखते हुए कि किसी भी नोड का बायां चाइल्ड सदैव उसके दाएं चाइल्ड से 1 स्थान पहले होता है, हमें मिलता है।

यदि रूट 0 के अतिरिक्त सूचकांक 1 पर स्थित है, तो प्रत्येक स्तर में अंतिम नोड सूचकांक पर है। इसका उपयोग करने से हीप के लिए और प्राप्त होता है जिनकी रूट 1 है।

मूल नोड

इस प्रकार से प्रत्येक नोड या तो अपने माता-पिता का बायाँ या दायाँ चाइल्ड है, इसलिए हम जानते हैं कि निम्नलिखित में से कोई भी सत्य है।

इस प्रकार,

अब अभिव्यक्ति पर विचार करें।

यदि नोड बायाँ चाइल्ड है, तो यह तुरंत परिणाम देता है, यद्यपि, यदि नोड दायाँ चाइल्ड है तो यह उचित परिणाम भी देता है। इस स्थिति में, सम होना चाहिए, और इसलिए विषम होना चाहिए।

इसलिए, चाहे कोई नोड बायां या दायां चाइल्ड हो, उसके माता-पिता को अभिव्यक्ति द्वारा पाया जा सकता है:

संबंधित संरचनाएं

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

इस प्रकार से बाइनरी हीप डी-एरी हीप का विशेष स्थिति है जिसमें d = 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) ?
  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]
  2. 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. Jump up to: 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 Amortized time.
  4. n is the size of the larger heap.
  5. Lower bound of [21] upper bound of [22]
  6. 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. Jump up to: 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.
  2. Williams, J. W. J. (1964), "Algorithm 232 - Heapsort", Communications of the ACM, 7 (6): 347–348, doi:10.1145/512274.512284
  3. Y Narahari, "Binary Heaps", Data Structures and Algorithms
  4. 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.
  5. 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.
  6. "python/cpython/heapq.py". GitHub (in English). Retrieved 2020-08-07.
  7. "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. Jump up to: 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.
  9. 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.
  10. Doberkat, Ernst E. (May 1984). "ढेर बनाने के लिए फ़्लॉइड के एल्गोरिथम का एक औसत केस विश्लेषण" (PDF). Information and Control. 6 (2): 114–131. doi:10.1016/S0019-9958(84)80053-4.
  11. 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.
  12. Kamp, Poul-Henning (June 11, 2010). "आपके द्वारा गलत किया जा रहा है". ACM Queue. Vol. 8, no. 6.
  13. 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.
  14. J.-R. Sack and T. Strothotte "An Algorithm for Merging Heaps", Acta Informatica 22, 171-186 (1985).
  15. Sack, Jörg-Rüdiger; Strothotte, Thomas (1990). "ढेर और उसके अनुप्रयोगों का एक लक्षण वर्णन". Information and Computation. 86: 69–86. doi:10.1016/0890-5401(90)90026-E.
  16. 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. Jump up to: 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.
  18. "Binomial Heap | Brilliant Math & Science Wiki". brilliant.org (in English). Retrieved 2019-09-30.
  19. 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.
  20. 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
  21. 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.
  22. 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.
  23. Brodal, Gerth S. (1996), "Worst-Case Efficient Priority Queues" (PDF), Proc. 7th Annual ACM-SIAM Symposium on Discrete Algorithms, pp. 52–58
  24. 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.
  25. Haeupler, Bernhard; Sen, Siddhartha; Tarjan, Robert E. (November 2011). "Rank-pairing heaps" (PDF). SIAM J. Computing. 40 (6): 1463–1485. doi:10.1137/100785351.
  26. 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.
  27. Takaoka, Tadao (1999), Theory of 2–3 Heaps (PDF), p. 12

बाहरी संबंध