बाइनरी हीप: Difference between revisions
No edit summary |
No edit summary |
||
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|संपूर्ण बाइनरी मिन हीप का उदाहरण]]बाइनरी | [[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'')}} की सबसे निकृष्ट स्थिति वाली समय जटिलता होती | आवश्यक संचालन की संख्या मात्र उन स्तरों की संख्या पर निर्भर करती है जो नवीन अवयव को हीप गुण को संतुष्ट करने के लिए बढ़ाना चाहिए। इस प्रकार, क्षेपण परिचालन में {{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]] | ::[[File:Heap add step1.svg|150px]] | ||
Line 49: | Line 49: | ||
::[[File:Heap add step3.svg|150px]] | ::[[File:Heap add step3.svg|150px]] | ||
::जो वैध अधिकतम-हीप है। इस अंतिम चरण के बाद बाएं बच्चे की जांच करने की कोई आवश्यकता नहीं है: प्रारम्भ में, अधिकतम-हीप वैध था, जिसका अर्थ है कि रूट पहले से ही अपने बाएं बच्चे से बड़ा था, इसलिए रूट को और भी अधिक मान के साथ बदलने से वह गुण बनी रहेगी प्रत्येक नोड अपने बच्चों से बड़ा है ({{nowrap|11 > 5}}; यदि {{nowrap|15 > 11}}, और {{nowrap|11 > 5}}, तो [[सकर्मक संबंध]] के कारण {{nowrap|15 > 5}}, )। | ::इस प्रकार से जो वैध अधिकतम-हीप है। इस अंतिम चरण के बाद बाएं बच्चे की जांच करने की कोई आवश्यकता नहीं है: प्रारम्भ में, अधिकतम-हीप वैध था, जिसका अर्थ है कि रूट पहले से ही अपने बाएं बच्चे से बड़ा था, इसलिए रूट को और भी अधिक मान के साथ बदलने से वह गुण बनी रहेगी प्रत्येक नोड अपने बच्चों से बड़ा है ({{nowrap|11 > 5}}; यदि {{nowrap|15 > 11}}, और {{nowrap|11 > 5}}, तो [[सकर्मक संबंध]] के कारण {{nowrap|15 > 5}}, )। | ||
===निष्कर्षण=== | ===निष्कर्षण=== | ||
Line 57: | Line 57: | ||
#नवीन रूट की तुलना उसके बच्चों से करें; यदि वे उचित क्रम में हैं, तो रुकें। | #नवीन रूट की तुलना उसके बच्चों से करें; यदि वे उचित क्रम में हैं, तो रुकें। | ||
#यदि नहीं, तो अवयव को उसके किसी बच्चे के साथ बदलें और पूर्व चरण पर वापस लौटें। (मिन-हीप में इसके छोटे बच्चे और उच्च-हीप में इसके बड़े बच्चे के साथ स्वैप करें।) | #यदि नहीं, तो अवयव को उसके किसी बच्चे के साथ बदलें और पूर्व चरण पर वापस लौटें। (मिन-हीप में इसके छोटे बच्चे और उच्च-हीप में इसके बड़े बच्चे के साथ स्वैप करें।) | ||
चरण 2 और 3, जो एक नोड की उसके बच्चों में से किसी एक के साथ तुलना करके और संभवतः स्वैप करके हीप | चरण 2 और 3, जो एक नोड की उसके बच्चों में से किसी एक के साथ तुलना करके और संभवतः स्वैप करके हीप गुण को पुनर्स्थापित करते हैं, निम्न-हीप (बबल-निम्न, परकोलेट-निम्न, सिफ्ट-निम्न, सिंक-निम्न, ट्रिकल निम्न, हेपिफाई-निम्न, कैस्केड-निम्न, निष्कर्षण-मिन या एक्सट्रैक्ट-मैक्स, या मात्र हेपिफाई के रूप में भी जाना जाता है) परिचालन कहलाते हैं। | ||
इसलिए, यदि हमारे गुण पहले जैसा ही अधिकतम-हीप है | इसलिए, यदि हमारे गुण पहले जैसा ही अधिकतम-हीप है | ||
Line 65: | Line 65: | ||
::[[File:Heap remove step1.svg|150px]] | ::[[File:Heap remove step1.svg|150px]] | ||
::अब हीप गुण का उल्लंघन हो गया है क्योंकि 8, 4 से बड़ा है। इस स्थिति में, दो अवयवों, 4 और 8 की गमागमन, हीप गुण को पुनः स्थापित करने के लिए पर्याप्त है और हमें आगे अवयवों की गमागमन करने की आवश्यकता नहीं है: | ::इस प्रकार से अब हीप गुण का उल्लंघन हो गया है क्योंकि 8, 4 से बड़ा है। इस स्थिति में, दो अवयवों, 4 और 8 की गमागमन, हीप गुण को पुनः स्थापित करने के लिए पर्याप्त है और हमें आगे अवयवों की गमागमन करने की आवश्यकता नहीं है: | ||
::[[File:Heap remove step2.svg|150px]] | ::[[File:Heap remove step2.svg|150px]] | ||
::नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े बच्चों के साथ स्वैप किया जाता है (मिन-हीप में इसे अपने छोटे बच्चे के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नवीन स्थिति में हीप गुण को संतुष्ट नहीं करता है। यह कार्यक्षमता 'मैक्स-हीपिफाई' फलन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (A) के सरणी डेटा संरचना-समर्थित हीप A के लिए छद्म कोड में नीचे परिभाषित किया गया है। A को 1 से प्रारम्भ करके अनुक्रमित किया गया है। | ::नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े बच्चों के साथ स्वैप किया जाता है (मिन-हीप में इसे अपने छोटे बच्चे के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नवीन स्थिति में हीप गुण को संतुष्ट नहीं करता है। अतः यह कार्यक्षमता '''<nowiki/>'मैक्स-हीपिफाई'''' फलन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (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 75: | Line 75: | ||
'''Max-Heapify'''(''A'', ''i''): | '''Max-Heapify'''(''A'', ''i''): | ||
''left'' ← 2×''i'' | |||
''right'' ← 2×''i'' + 1 | ''right'' ← 2×''i'' + 1 | ||
Line 97: | Line 97: | ||
=== निवेशन फिर निष्कर्षण === | === निवेशन फिर निष्कर्षण === | ||
किसी अवयव को सम्मिलित करना और फिर हीप से निकालना ऊपर परिभाषित निवेशन और निष्कर्षण संक्रिया को कॉल करने की तुलना में अधिक कुशलता से किया जा सकता है, जिसमें दोनों <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. | // 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 | // ''heap'': an array representing the heap, indexed at 1 | ||
Line 117: | Line 117: | ||
_downheap(''heap'' starting from index 1) | _downheap(''heap'' starting from index 1) | ||
'''return''' ''item'' | '''return''' ''item'' | ||
एक समान फलन को पॉपिंग और फिर डालने के लिए परिभाषित किया जा सकता है, जिसे पायथन में हीपप्रीप्लेस कहा जाता है: | इस प्रकार से एक समान फलन को पॉपिंग और फिर डालने के लिए परिभाषित किया जा सकता है, जिसे पायथन में हीपप्रीप्लेस कहा जाता है: | ||
// Extract the root of the heap, and push a new item | // Extract the root of the heap, and push a new item | ||
// ''heap'': an array representing the heap, indexed at 1 | // ''heap'': an array representing the heap, indexed at 1 | ||
Line 128: | Line 128: | ||
=== सर्च === | === सर्च === | ||
एक यादृच्छिक अवयव ढूँढने में O(n) समय लगता है। | इस प्रकार से एक यादृच्छिक अवयव ढूँढने में O(n) समय लगता है। | ||
=== विलोप === | === विलोप === | ||
किसी यादृच्छिक अवयव को हटाना इस प्रकार किया जा सकता है: | इस प्रकार से किसी यादृच्छिक अवयव को हटाना इस प्रकार किया जा सकता है: | ||
# जिस अवयव को हम हटाना चाहते हैं उसका सूचकांक <math>i</math> ढूंढें। | # जिस अवयव को हम हटाना चाहते हैं उसका सूचकांक <math>i</math> ढूंढें। | ||
Line 138: | Line 138: | ||
=== न्यूनता या वृद्धि कुंजी === | === न्यूनता या वृद्धि कुंजी === | ||
अतः न्यूनता कुंजी परिचालन किसी दिए गए मान के साथ नोड के मान को कम मान से बदल देता है, और वृद्धि कुंजी परिचालन भी वही करता है परन्तु उच्च मान के साथ। इसमें दिए गए मान के साथ नोड ढूंढना, मान बदलना, और फिर हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाइंग या ऊपरहीपिफाइंग सम्मिलित है। | |||
इस प्रकार से न्यूनता कुंजी इस प्रकार की जा सकती है: | |||
# उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं। | # उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं। | ||
Line 146: | Line 146: | ||
# हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई (अधिकतम हीप मानकर)। | # हीप गुण को पुनर्स्थापित करने के लिए निम्न-हीपिफाई (अधिकतम हीप मानकर)। | ||
कुंजी को इस प्रकार बढ़ाया जा सकता है: | इस प्रकार से कुंजी को इस प्रकार बढ़ाया जा सकता है: | ||
# उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं। | # उस अवयव का सूचकांक ढूंढें जिसे हम संशोधित करना चाहते हैं। | ||
# नोड का मान बढ़ाएँ। | # नोड का मान बढ़ाएँ। | ||
# हीप गुण को पुनर्स्थापित करने के लिए ऊपर-हीपिफाइ | # हीप गुण को पुनर्स्थापित करने के लिए ऊपर-हीपिफाइ (अधिकतम हीप मानकर)। | ||
==हीप बनाना== | ==हीप बनाना== | ||
एन इनपुट अवयवों की एक सरणी से एक हीप का निर्माण एक रिक्त हीप से प्रारम्भ करके, फिर क्रमिक रूप से प्रत्येक अवयव को सम्मिलित करके किया जा सकता है। यह दृष्टिकोण, जिसे बाइनरी हीप के आविष्कारक के नाम पर विलियम्स विधि कहा जाता है, सरलता से '''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>}} | इस प्रकार से एन इनपुट अवयवों की एक सरणी से एक हीप का निर्माण एक रिक्त हीप से प्रारम्भ करके, फिर क्रमिक रूप से प्रत्येक अवयव को सम्मिलित करके किया जा सकता है। यह दृष्टिकोण, जिसे बाइनरी हीप के आविष्कारक के नाम पर विलियम्स विधि कहा जाता है, सरलता से '''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> पर ट्री | यद्यपि, विलियम्स की विधि इष्टतम नहीं है। तीव्र विधि (रॉबर्ट डब्ल्यू फ़्लॉइड के कारण{{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 167: | Line 167: | ||
यह इस तथ्य का उपयोग करता है कि दी गई अनंत [[श्रृंखला (गणित)]] <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|''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 191: | Line 191: | ||
}} 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}}''', ..., द्वारा अनुक्रमित सरणी अवयव ट्री के सभी पत्र हैं (यह मानते हुए कि सूचकांक 1 से प्रारम्भ होते हैं) - इस प्रकार प्रत्येक एक-अवयव का हीप है, और इसे नीचे-हीप करने की आवश्यकता नहीं है। '''बिल्ड-मैक्स-हीप''' शेष प्रत्येक ट्री नोड पर '''मैक्स-हीपिफाई''' चलाता है। | ||
'''Build-Max-Heap''' (''A''): | '''Build-Max-Heap''' (''A''): | ||
'''for each''' index ''i'' '''from''' ''floor''(''length''(''A'')/2) '''downto''' 1 '''do:''' | |||
'''Max-Heapify'''(''A'', ''i'') | '''Max-Heapify'''(''A'', ''i'') | ||
Line 200: | Line 200: | ||
== हीप कार्यान्वयन == | == हीप कार्यान्वयन == | ||
[[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|बाइनरी हीप और सरणी कार्यान्वयन के बीच तुलना।]]हीप को सामान्यतः सरणी डेटा संरचना के साथ कार्यान्वित किया जाता है। किसी भी बाइनरी ट्री को सरणी में संग्रहीत किया जा सकता है, परन्तु क्योंकि बाइनरी हीप सदैव पूर्ण बाइनरी ट्री होता है, इसे संहत रूप से संग्रहीत किया जा सकता है। [[ सूचक (कंप्यूटर प्रोग्रामिंग) |सूचक (कंप्यूटर प्रोग्रामिंग)]] के लिए किसी स्थान की आवश्यकता नहीं है; इसके अतिरिक्त, प्रत्येक नोड के माता-पिता और बच्चों को सरणी सूचकांकों पर अंकगणित द्वारा पाया जा सकता है। ये गुण इस हीप कार्यान्वयन को अंतर्निहित डेटा संरचना या [[वंशावली]] सूची का सरल उदाहरण बनाते हैं। विवरण मूल स्थिति पर निर्भर करते हैं, जो इसके स्थान पर कार्यान्वयन के लिए उपयोग की जाने वाली [[प्रोग्रामिंग भाषा]] की बाधाओं या प्रोग्रामर की प्राथमिकता पर निर्भर हो सकते हैं। विशेष रूप से, कभी-कभी अंकगणित को सरल बनाने के लिए मूल को सूचकांक 1 पर रखा जाता है। | [[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)। | * सूचकांक [[फर्श समारोह|फलक]] फलन पर इसका मूल ((i - 1) / 2)। | ||
वैकल्पिक रूप से, यदि ट्री की रूट सूचकांक 1 पर है, वैध सूचकांक 1 से एन के साथ, तो सूचकांक i पर प्रत्येक अवयव a है | इस प्रकार से वैकल्पिक रूप से, यदि ट्री की रूट सूचकांक 1 पर है, वैध सूचकांक 1 से एन के साथ, तो सूचकांक i पर प्रत्येक अवयव a है | ||
*सूचकांक 2i और 2i +1 पर बच्चे | *सूचकांक 2i और 2i +1 पर बच्चे | ||
* सूचकांक [[फर्श समारोह|फलक]] फलन (i/2) पर इसका मूल। | * सूचकांक [[फर्श समारोह|फलक]] फलन (i/2) पर इसका मूल। | ||
इस कार्यान्वयन का उपयोग हीप सॉर्ट एल्गोरिदम में किया जाता है जो हीप को संग्रहीत करने के लिए इनपुट सरणी को आवंटित स्थान का पुन: उपयोग करता है (अर्थात एल्गोरिदम [[इन-प्लेस एल्गोरिदम]] | अतः इस कार्यान्वयन का उपयोग हीप सॉर्ट एल्गोरिदम में किया जाता है जो हीप को संग्रहीत करने के लिए इनपुट सरणी को आवंटित स्थान का पुन: उपयोग करता है (अर्थात एल्गोरिदम [[इन-प्लेस एल्गोरिदम]] किया जाता है)। यह कार्यान्वयन प्राथमिकता पंक्ति के रूप में भी उपयोगी है। जब [[गतिशील सरणी]] का उपयोग किया जाता है, तो असीमित संख्या में वस्तुों का क्षेपण संभव है। | ||
<code>upheap</code> | <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''' श्रेणी '''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. | |||
[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> एन अवयवों पर हीप को | Dictionary of Algorithms and Data Structures, Paul E. Black, ed., U.S. National Institute of Standards and Technology. 16 November 2009.</ref> एन अवयवों पर हीप को 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'') में मर्ज किया जा सकता है। | ||
उप- | |||
इसके अतिरिक्त, बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, परन्तु अवयव जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न अवयव को खोजने में समस्या होती है। इस अवयव को एल्गोरिदमिक रूप से या नोड में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - मात्र बच्चों के संदर्भों को संग्रहीत करने के अतिरिक्त, हम नोड के [[क्रम में]] उत्तराधिकारी को भी संग्रहीत करते हैं। | इस प्रकार से इसके अतिरिक्त, बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, परन्तु अवयव जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न अवयव को खोजने में समस्या होती है। इस अवयव को एल्गोरिदमिक रूप से या नोड में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - मात्र बच्चों के संदर्भों को संग्रहीत करने के अतिरिक्त, हम नोड के [[क्रम में]] उत्तराधिकारी को भी संग्रहीत करते हैं। | ||
अतः बड़े O संकेतन में सबसे छोटे और सबसे बड़े दोनों अवयवों के निष्कर्षण को संभव बनाने के लिए हीप संरचना को <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 239: | 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 पर रूट वाले | इस प्रकार से एक सरणी-आधारित हीप में, नोड के बच्चों और माता-पिता को नोड के सूचकांक पर सरल अंकगणित के माध्यम से स्थित किया जा सकता है। अतः यह खंड सूचकांक 0 पर रूट वाले हीप के लिए प्रासंगिक समीकरण प्राप्त करता है, सूचकांक 1 पर रूट वाले हीप पर अतिरिक्त सूचना के साथ। | ||
भ्रम से बचने के लिए, हम नोड के स्तर को रूट से उसकी दूरी के रूप में परिभाषित करेंगे, जैसे कि रूट स्वयं स्तर 0 पर हो। | इस प्रकार से भ्रम से बचने के लिए, हम नोड के स्तर को रूट से उसकी दूरी के रूप में परिभाषित करेंगे, जैसे कि रूट स्वयं स्तर 0 पर हो। | ||
=== बच्चों नोड === | === बच्चों नोड === | ||
सूचकांक पर स्थित सामान्य नोड | अतः सूचकांक पर स्थित सामान्य नोड {{mvar|i}} के लिए (0 से प्रारम्भ करके), हम पहले इसके उचित बच्चे, <math>\text{right} = 2i + 2</math> का सूचकांक प्राप्त करेंगे। | ||
मान लीजिए कि नोड {{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> | ||
मान लीजिए कि परत L में नोड {{mvar|i}} के बाद {{mvar|j}} नोड हैं, जैसे कि | |||
::<math>\begin{alignat}{2} | ::<math>\begin{alignat}{2} | ||
Line 260: | Line 260: | ||
\end{alignat} | \end{alignat} | ||
</math> | </math> | ||
इनमें से प्रत्येक {{mvar|j}} नोड में | इस प्रकार से इनमें से प्रत्येक {{mvar|j}} नोड में ठीक 2 बच्चे होने चाहिए, इसलिए {{mvar|i}} के उचित बच्चे को उसकी परत (<math>L + 1</math>) के अंत से अलग करने वाले <math>2j</math> नोड होने चाहिए। | ||
::<math>\begin{alignat}{2} | ::<math>\begin{alignat}{2} | ||
Line 271: | Line 271: | ||
आवश्यकता अनुसार। | आवश्यकता अनुसार। | ||
यह देखते हुए कि किसी भी नोड का बायां बच्चा सदैव उसके दाएं बच्चे से 1 स्थान पहले होता है, हमें | अतः यह देखते हुए कि किसी भी नोड का बायां बच्चा सदैव उसके दाएं बच्चे से 1 स्थान पहले होता है, हमें <math>\text{left} = 2i + 1</math> मिलता है। | ||
यदि रूट 0 के अतिरिक्त सूचकांक 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>i</math> | यदि नोड <math>i</math> बायाँ बच्चा है, तो यह तुरंत परिणाम देता है, यद्यपि, यदि नोड <math>i</math> दायाँ बच्चा है तो यह उचित परिणाम भी देता है। इस स्थिति में, <math>(i - 2)</math> सम होना चाहिए, और इसलिए <math>(i - 1)</math> विषम होना चाहिए। | ||
::<math>\begin{alignat}{2} | ::<math>\begin{alignat}{2} | ||
Line 297: | Line 297: | ||
::<math>\text{parent} = \left\lfloor \dfrac{i - 1}{2} \right\rfloor</math> | ::<math>\text{parent} = \left\lfloor \dfrac{i - 1}{2} \right\rfloor</math> | ||
==संबंधित संरचनाएं== | ==संबंधित संरचनाएं== | ||
चूँकि हीप में भाई-बहनों का क्रम हीप गुण द्वारा निर्दिष्ट नहीं किया जाता है, एकल नोड के दो बच्चों को स्वतंत्र रूप से तब तक बदला जा सकता है जब तक कि ऐसा करने से आकार गुण का उल्लंघन न हो ( | चूँकि हीप में भाई-बहनों का क्रम हीप गुण द्वारा निर्दिष्ट नहीं किया जाता है, एकल नोड के दो बच्चों को स्वतंत्र रूप से तब तक बदला जा सकता है जब तक कि ऐसा करने से आकार गुण का उल्लंघन न हो (ट्रीप के साथ तुलना करें)। यद्यपि, ध्यान दें कि सामान्य सरणी-आधारित हीप में, मात्र बच्चों की गमागमन करने से हीप गुण को बनाए रखने के लिए बच्चों के उप-ट्री नोड को स्थानांतरित करने की भी आवश्यकता हो सकती है। | ||
बाइनरी हीप [[डी-एरी ढेर|डी-एरी]] हीप का विशेष | इस प्रकार से बाइनरी हीप [[डी-एरी ढेर|डी-एरी]] हीप का विशेष स्थिति है जिसमें d = 2 है। | ||
==चलने के समय का सारांश== | ==चलने के समय का सारांश== |
Revision as of 10:01, 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]
इस प्रकार से बाइनरी हीप क्षेपण के उदाहरण के रूप में, मान लें कि हमारे गुण अधिकतम-हीप
- इस प्रकार से जो वैध अधिकतम-हीप है। इस अंतिम चरण के बाद बाएं बच्चे की जांच करने की कोई आवश्यकता नहीं है: प्रारम्भ में, अधिकतम-हीप वैध था, जिसका अर्थ है कि रूट पहले से ही अपने बाएं बच्चे से बड़ा था, इसलिए रूट को और भी अधिक मान के साथ बदलने से वह गुण बनी रहेगी प्रत्येक नोड अपने बच्चों से बड़ा है (11 > 5; यदि 15 > 11, और 11 > 5, तो सकर्मक संबंध के कारण 15 > 5, )।
निष्कर्षण
हीप गुण को बनाए रखते हुए हीप से रूट को हटाने की प्रक्रिया (अधिकतम-हीप में अधिकतम अवयव या न्यूनतम-हीप में न्यूनतम अवयव को प्रभावी रूप से निकालना) इस प्रकार है:
- हीप की रूट को अंतिम स्तर पर अंतिम अवयव से बदलें।
- नवीन रूट की तुलना उसके बच्चों से करें; यदि वे उचित क्रम में हैं, तो रुकें।
- यदि नहीं, तो अवयव को उसके किसी बच्चे के साथ बदलें और पूर्व चरण पर वापस लौटें। (मिन-हीप में इसके छोटे बच्चे और उच्च-हीप में इसके बड़े बच्चे के साथ स्वैप करें।)
चरण 2 और 3, जो एक नोड की उसके बच्चों में से किसी एक के साथ तुलना करके और संभवतः स्वैप करके हीप गुण को पुनर्स्थापित करते हैं, निम्न-हीप (बबल-निम्न, परकोलेट-निम्न, सिफ्ट-निम्न, सिंक-निम्न, ट्रिकल निम्न, हेपिफाई-निम्न, कैस्केड-निम्न, निष्कर्षण-मिन या एक्सट्रैक्ट-मैक्स, या मात्र हेपिफाई के रूप में भी जाना जाता है) परिचालन कहलाते हैं।
इसलिए, यदि हमारे गुण पहले जैसा ही अधिकतम-हीप है
- नीचे की ओर बढ़ने वाले नोड को अधिकतम-हीप में अपने बड़े बच्चों के साथ स्वैप किया जाता है (मिन-हीप में इसे अपने छोटे बच्चे के साथ स्वैप किया जाएगा), जब तक कि यह अपनी नवीन स्थिति में हीप गुण को संतुष्ट नहीं करता है। अतः यह कार्यक्षमता 'मैक्स-हीपिफाई' फलन द्वारा प्राप्त की जाती है जैसा कि लंबाई लंबाई (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, ..., द्वारा अनुक्रमित सरणी अवयव ट्री के सभी पत्र हैं (यह मानते हुए कि सूचकांक 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 पर तब तक लागू किया जाता है जब तक कि सभी अवयवों के लिए हीप गुण स्थापित नहीं हो जाती है।
इस प्रकार से सिफ्ट-निम्न फलन तीव्र है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह कार्य कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम log2 e चरण आवश्यक हैं।
अतः बड़े हीप और आभासी मेमोरी का उपयोग करने के लिए, उपरोक्त योजना के अनुसार अवयवों को सरणी में संग्रहीत करना अक्षम है: (लगभग) प्रत्येक स्तर अलग पृष्ठ (कंप्यूटर मेमोरी) में है। बी-हीप बाइनरी हीप हैं जो उपट्री को पृष्ठ में रखते हैं, जिससे अभिगामित किए गए पृष्ठों की संख्या दस गुना तक कम हो जाती है।[12]
इस प्रकार से दो बाइनरी हीप को मर्ज करने की प्रक्रिया समान आकार के हीप के लिए Θ(n) लेती है। सबसे ठीक आप जो कर सकते हैं वह है (सरणी कार्यान्वयन के स्थिति में) मात्र दो हीप सारणियों को जोड़ना और परिणाम का हीप बनाना।[13] एन अवयवों पर हीप को O(log n log k) कुंजी तुलनाओं का उपयोग करके, या पॉइंटर-आधारित कार्यान्वयन के स्थिति में, O(log n log k) समय में, के अवयवों पर हीप के साथ मर्ज किया जा सकता है।[14] नवीन दृश्य के आधार पर, n अवयवों पर हीप को क्रमशः k और n-k अवयवों पर दो हीप में विभाजित करने के लिए एल्गोरिदम उप-हीप के क्रमबद्ध संग्रह के रूप में हीप को प्रस्तुत किया गया था।[15] एल्गोरिथम को O(log n * log n) तुलना की आवश्यकता होती है। यह दृश्य हीप के मर्ज के लिए नवीन और वैचारिक रूप से सरल एल्गोरिदम भी प्रस्तुत करता है। जब मर्ज सामान्य कार्य है, तो अलग हीप कार्यान्वयन की संस्तुति की जाती है, जैसे द्विपद हीप, जिसे O(log n) में मर्ज किया जा सकता है।
इस प्रकार से इसके अतिरिक्त, बाइनरी हीप को पारंपरिक बाइनरी ट्री डेटा संरचना के साथ कार्यान्वित किया जा सकता है, परन्तु अवयव जोड़ते समय बाइनरी हीप पर अंतिम स्तर पर आसन्न अवयव को खोजने में समस्या होती है। इस अवयव को एल्गोरिदमिक रूप से या नोड में अतिरिक्त डेटा जोड़कर निर्धारित किया जा सकता है, जिसे ट्री थ्रेडिंग कहा जाता है - मात्र बच्चों के संदर्भों को संग्रहीत करने के अतिरिक्त, हम नोड के क्रम में उत्तराधिकारी को भी संग्रहीत करते हैं।
अतः बड़े O संकेतन में सबसे छोटे और सबसे बड़े दोनों अवयवों के निष्कर्षण को संभव बनाने के लिए हीप संरचना को समय में संशोधित करना संभव है।[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) | ? |
- ↑ 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.
- ↑ Jump up to: 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]
यह भी देखें
- हीप (डेटा संरचना)
- हीप बनाएं और छांटें
संदर्भ
- ↑ 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.
- ↑ 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().
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ "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