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

From Vigyanwiki
No edit summary
No edit summary
 
(9 intermediate revisions by 3 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 में जे.डब्ल्यू.जे. विलियम्स द्वारा 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]]
::[[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 55: Line 55:


#हीप की रूट को अंतिम स्तर पर अंतिम अवयव से बदलें।
#हीप की रूट को अंतिम स्तर पर अंतिम अवयव से बदलें।
#नवीन रूट की तुलना उसके बच्चों से करें; यदि वे उचित क्रम में हैं, तो रुकें।
#नवीन रूट की तुलना उसके चाइल्ड से करें; यदि वे उचित क्रम में हैं, तो रुकें।
#यदि नहीं, तो अवयव को उसके किसी बच्चे के साथ बदलें और पूर्व चरण पर वापस लौटें। (मिन-हीप में इसके छोटे बच्चे और उच्च-हीप में इसके बड़े बच्चे के साथ स्वैप करें।)
#यदि नहीं, तो अवयव को उसके किसी चाइल्ड के साथ बदलें और पूर्व चरण पर वापस लौटें। (लघु-हीप में इसके छोटे चाइल्ड और उच्च-हीप में इसके बड़े चाइल्ड के साथ स्वैप करें।)
चरण 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/>''' '''<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''
  ''left'' ← 2×''i''


     ''right'' ← 2×''i'' + 1
     ''right'' ← 2×''i'' + 1
Line 92: Line 92:
         '''swap''' ''A''[''i''] and ''A''[''largest'']
         '''swap''' ''A''[''i''] and ''A''[''largest'']
         '''Max-Heapify'''(''A'', ''largest'')
         '''Max-Heapify'''(''A'', ''largest'')
उपरोक्त एल्गोरिदम के लिए सरणी को उचित रूप से पुन: हीप करने के लिए, सूचकांक i और उसके दो प्रत्यक्ष बच्चों के नोड के अतिरिक्त कोई भी नोड हीप गुण का उल्लंघन नहीं कर सकता है। निम्न-हीप परिचालन (पूर्ववर्ती स्वैप के बिना) का उपयोग रूट के मान को संशोधित करने के लिए भी किया जा सकता है, तब भी जब कोई अवयव हटाया नहीं जा रहा हो।
उपरोक्त एल्गोरिदम के लिए सरणी को उचित रूप से पुन: हीप करने के लिए, सूचकांक 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>}}
इस प्रकार से 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>इसलिए, सभी उपवृक्षों को हीप करने की लागत है:
यद्यपि, विलियम्स की विधि इष्टतम नहीं है। तीव्र विधि (रॉबर्ट डब्ल्यू फ़्लॉइड के कारण{{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 163: 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 177: 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 188: Line 190:
  |citeseerx=10.1.1.15.9526
  |citeseerx=10.1.1.15.9526
}}  Note that this paper uses Floyd's original terminology "siftup" for what is now called sifting ''down''.</ref>
}}  Note that this paper uses Floyd's original terminology "siftup" for what is now called sifting ''down''.</ref>
बिल्ड-मैक्स-हीप फलन जो इसके बाद आता है, सरणी A को परिवर्तित करता है जो संपूर्ण को संग्रहीत करता है
बार-बार बॉटम-अप तरीके से मैक्स-हीपिफ़ाई (अधिकतम-हीप के लिए निम्न-हीपिफ़ाई) का उपयोग करके अधिकतम-हीप में ''एन'' नोड के साथ बाइनरी ट्री।
सरणी अवयवों को अनुक्रमित किया गया
{{nowrap|''[[floor function|floor]]''(''n''/2) + 1}}, {{nowrap|''floor''(''n''/2) + 2}}, ..., एन
सभी पत्तियाँ ट्री के लिए हैं (यह मानते हुए कि सूचकांक 1 से प्रारम्भ होते हैं) - इस प्रकार प्रत्येक एक-अवयव का हीप है, और इसे नीचे-हीप करने की आवश्यकता नहीं है। 'बिल्ड-मैक्स-हीप' चलता है
शेष वृक्ष नोड में से प्रत्येक पर 'मैक्स-हीपिफाई'।


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


== हीप कार्यान्वयन ==
== हीप कार्यान्वयन ==
[[File:Binary tree in array.svg|right|frame|एक सरणी में संग्रहीत छोटा पूर्ण बाइनरी ट्री]]
[[File:Binary tree in array.svg|right|frame|एक सरणी में संग्रहीत छोटा पूर्ण बाइनरी ट्री]]
[[File:Binary Heap with Array Implementation.JPG|400px|thumb|right|बाइनरी हीप और सरणी कार्यान्वयन के बीच तुलना।]]हीप को सामान्यतः ऐरे डेटा संरचना के साथ कार्यान्वित किया जाता है। किसी भी बाइनरी ट्री को सरणी में संग्रहीत किया जा सकता है, लेकिन क्योंकि बाइनरी हीप हमेशा पूर्ण बाइनरी ट्री होता है, इसे कॉम्पैक्ट रूप से संग्रहीत किया जा सकता है। [[ सूचक (कंप्यूटर प्रोग्रामिंग) ]] के लिए किसी स्थान की आवश्यकता नहीं है; इसके बजाय, प्रत्येक नोड के माता-पिता और बच्चों को सरणी सूचकांकों पर अंकगणित द्वारा पाया जा सकता है। ये गुण इस हीप कार्यान्वयन को अंतर्निहित डेटा संरचना या [[वंशावली]] सूची का सरल उदाहरण बनाते हैं। विवरण मूल स्थिति पर निर्भर करते हैं, जो बदले में कार्यान्वयन के लिए उपयोग की जाने वाली [[प्रोग्रामिंग भाषा]] की बाधाओं या प्रोग्रामर की प्राथमिकता पर निर्भर हो सकते हैं। विशेष रूप से, कभी-कभी अंकगणित को सरल बनाने के लिए मूल को सूचकांक 1 पर रखा जाता है।
[[File:Binary Heap with Array Implementation.JPG|400px|thumb|right|बाइनरी हीप और सरणी कार्यान्वयन के बीच तुलना।]]इस प्रकार से हीप को सामान्यतः सरणी डेटा संरचना के साथ कार्यान्वित किया जाता है। किसी भी बाइनरी ट्री को सरणी में संग्रहीत किया जा सकता है, परन्तु क्योंकि बाइनरी हीप सदैव पूर्ण बाइनरी ट्री होता है, इसे संहत रूप से संग्रहीत किया जा सकता है। [[ सूचक (कंप्यूटर प्रोग्रामिंग) |सूचक (कंप्यूटर प्रोग्रामिंग)]] के लिए किसी स्थान की आवश्यकता नहीं है; इसके अतिरिक्त, प्रत्येक नोड के माता-पिता और चाइल्ड को सरणी सूचकांकों पर अंकगणित द्वारा पाया जा सकता है। ये गुण इस हीप कार्यान्वयन को अंतर्निहित डेटा संरचना या [[वंशावली]] सूची का सरल उदाहरण बनाते हैं। विवरण मूल स्थिति पर निर्भर करते हैं, जो इसके स्थान पर कार्यान्वयन के लिए उपयोग की जाने वाली [[प्रोग्रामिंग भाषा|प्रोग्रामिंग लैंग्वेज]] की बाधाओं या प्रोग्रामर की प्राथमिकता पर निर्भर हो सकते हैं। विशेष रूप से, कभी-कभी अंकगणित को सरल बनाने के लिए मूल को सूचकांक 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) पर इसका मूल।


मान लीजिए n हीप में अवयवों की संख्या है और i हीप को संग्रहीत करने वाले सरणी का मनमाना वैध सूचकांक है। यदि ट्री की रूट सूचकांक 0 पर है, वैध सूचकांक 0 से एन - 1 के साथ, तो सूचकांक i पर प्रत्येक अवयव a है
अतः इस कार्यान्वयन का उपयोग हीप सॉर्ट एल्गोरिदम में किया जाता है जो हीप को संग्रहीत करने के लिए इनपुट सरणी को आवंटित स्थान का पुन: उपयोग करता है (अर्थात एल्गोरिदम [[इन-प्लेस एल्गोरिदम]] किया जाता है)। यह कार्यान्वयन प्राथमिकता पंक्ति के रूप में भी उपयोगी है। जब [[गतिशील सरणी]] का उपयोग किया जाता है, तो असीमित संख्या में वस्तु का निवेशन संभव है।
* सूचकांक 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 तक बढ़ाता है।
<code>upheap</code> या <code>downheap</code> संचालन को सरणी के संदर्भ में निम्नानुसार बताया जा सकता है: मान लीजिए कि हीप गुण सूचकांक '''''b, b + 1, ..., e''''' के लिए है। सिफ्ट-निम्न फलन हीप गुण को '''''b−1, b, b+1, ..., e''''' तक बढ़ाता है। मात्र सूचकांक '''i = b−1''' हीप गुण का उल्लंघन कर सकता है।
मात्र सूचकांक i = b−1 हीप गुण का उल्लंघन कर सकता है।
मान लें कि j श्रेणी b, ..., e के भीतर a[i] (अधिकतम-हीप के लिए, या न्यूनतम-हीप के लिए सबसे छोटे बच्चे) के सबसे बड़े बच्चे का सूचकांक है।
(यदि ऐसा कोई सूचकांक मौजूद नहीं है क्योंकि {{nowrap|2''i'' > ''e''}} तो हीप गुण नवीन विस्तारित सीमा के लिए बनी रहती है और कुछ भी करने की आवश्यकता नहीं होती है।)
a[i] और a[j] मानों की गमागमन करके स्थिति i के लिए हीप गुण स्थापित की जाती है।
इस बिंदु पर, एकमात्र समस्या यह है कि हीप गुण सूचकांक जे के लिए मान्य नहीं हो सकती है।
सिफ्ट-निम्न फलन को [[ पूँछ प्रत्यावर्तन ]]|टेल-रिकर्सिव रूप से इंडेक्स जे पर तब तक लागू किया जाता है जब तक कि सभी अवयवों के लिए हीप गुण स्थापित नहीं हो जाती।


सिफ्ट-निम्न फलन तेज़ है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह काम कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम लॉग में<sub>2</sub> ई कदम आवश्यक हैं।
मान लें कि '''j''' श्रेणी '''b, ..., e''' के भीतर '''a[i]''' (अधिकतम-हीप के लिए, या न्यूनतम-हीप के लिए सबसे छोटे चाइल्ड) के सबसे बड़े चाइल्ड का सूचकांक है। (यदि ऐसा कोई सूचकांक स्थित नहीं है क्योंकि '''{{nowrap|2''i'' > ''e''}}''' तो हीप गुण नवीन विस्तारित सीमा के लिए बनी रहती है और कुछ भी करने की आवश्यकता नहीं होती है।) '''a[i]''' और '''a[j]''' मानों की गमागमन करके स्थिति i के लिए हीप गुण स्थापित की जाती है। इस बिंदु पर, एकमात्र समस्या यह है कि हीप गुण सूचकांक '''j''' के लिए मान्य नहीं हो सकती है।सिफ्ट-निम्न फलन को [[ पूँछ प्रत्यावर्तन |पश्च प्रत्यावर्तन]] रूप से सूचकांक '''j''' पर तब तक लागू किया जाता है जब तक कि सभी अवयवों के लिए हीप गुण स्थापित नहीं हो जाती है।


बड़े हीप और [[ आभासी मेमोरी ]] का उपयोग करने के लिए, उपरोक्त योजना के अनुसार अवयवों को सरणी में संग्रहीत करना अक्षम है: (लगभग) हर स्तर अलग पृष्ठ (कंप्यूटर मेमोरी) में है। [[ बी-ढेर | बी-हीप]] ्स बाइनरी हीप हैं जो सबट्रीज़ को पेज में रखते हैं, जिससे एक्सेस किए गए पेजों की संख्या दस गुना तक कम हो जाती है।<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}}
इस प्रकार से सिफ्ट-निम्न फलन तीव्र है। प्रत्येक चरण में इसे मात्र दो तुलनाओं और स्वैप की आवश्यकता होती है। सूचकांक मान जहां यह कार्य कर रहा है प्रत्येक पुनरावृत्ति में दोगुना हो जाता है, ताकि अधिकतम 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 242: 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 263: 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 274: 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 296: 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 321: 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

बाहरी संबंध