डी-एरी हीप

$d$-एरी हीप या $d$-हीप एक प्राथमिक डेटा संरचना होती है, जो बाइनरी हीप का एक सामान्यीकरण होता है जिसमें नोड्स होते है $d$ 2।  इस प्रकार, एक बाइनरी हीप 2-हीप होती है, और एक टर्नरी हीप 3-हीप होती है। टारजन और जेन्सेन एट अल के अनुसार $d$-एरी हीप्स का आविष्कार डोनाल्ड बी. जॉनसन ने 1975 में किया था।

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

डेटा संरचना
$d$-एरी हीप में एक ऐरे डेटा संरचना होती है $n$, जिनमें से प्रत्येक के साथ एक प्राथमिकता जुड़ी हुई होती है। इन पदोंं को संपूर्ण रूप से नोड्स के रूप में देखा जा सकता है $d$-एरी ट्री,: सरणी की स्थिति 0 पर (शून्य-आधारित नंबरिंग का उपयोग करके) ट्री बनाता है, स्थिति 1 से लेकर $d$ तक इसके चाइल्ड नोड होते है इस प्रकार, स्थिति में पद $i$ (इसके लिए $i > 0$) स्थिति पर पद है $\floor{(i &minus; 1)/d}$ और उसके चाइल्ड पदों पर पद है $di + 1$ द्वारा $di + d$. बाइनरी हीप के अनुसार, मिन-हीप में, प्रत्येक पद की एक प्राथमिकता होती है जो कम से कम उसके मूल के बराबर बड़ी होती है, अधिकतम-हीप में, प्रत्येक पद की एक प्राथमिकता होती है जो उसके मूल से बड़ी नहीं होती है।

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

हीप में एक नया पद डालने के लिए, पद को सरणी के अंत में जोड़ा जाता है, और फिर जब हीप का उल्लंघन होता है तो इसे अपने मूल के साथ बदल दिया जाता है, इसे ट्री में ऊपर की ओर और सरणी में पहले ले जाया जाता है उसी अपवर्ड-स्वैपिंग प्रक्रिया का उपयोग न्यूनतम-हीप में किसी पद की प्राथमिकता को कम करने, या अधिकतम-हीप में किसी पद की प्राथमिकता को बढ़ाने के लिए किया जा सकता है।

किसी सारणी से एक नया हीप बनाने के लिए $n$, पद की स्थिति से प्रारंभ करते हुए, रिवर्स ऑर्डर में पद पर लूप कर सकता है $n &minus; 1$ और पद को स्थिति 0 पर समाप्त करते हुए, प्रत्येक पद के लिए डाउनवर्ड-स्वैपिंग प्रक्रिया को प्रारंभ करता है।

विश्लेषण
एक $d$-एरी हीप के साथ $n$ पद, ऊपर की ओर-स्वैपिंग प्रक्रिया और नीचे की ओर-स्वैपिंग प्रक्रिया दोनों ही कार्य कर सकते है $log_{d} n = log n / log d$। अपवर्ड-स्वैपिंग प्रक्रिया में, प्रत्येक स्वैप में किसी पद की उसके मूल के साथ एकल तुलना सम्मलित होती है, और इसमें निरंतर समय लगता है। इसलिए, हीप में एक नया पद डालने, न्यूनतम-हीप में किसी पद की प्राथमिकता को कम करने, या अधिकतम-हीप में किसी पद की प्राथमिकता बढ़ाने का समय है $O(log n / log d)$. डाउनवर्ड-स्वैपिंग प्रक्रिया में, प्रत्येक स्वैप सम्मलित होते है $d$ और $O(d)$ समय लगता है $d &minus; 1$ चाइल्ड की न्यूनतम या अधिकतम संख्या निर्धारित करने के लिए चाइल्ड नोड के विरुद्ध अदला-बदली की आवश्यकता होती है। इसलिए, रूट पद को हटाने, न्यूनतम-हीप में किसी पद की प्राथमिकता बढ़ाने या अधिकतम-हीप में किसी पद की प्राथमिकता कम करने का समय है $O(d log n / log d)$.

$d$-एन पदोंं के एक सेट हीप, अधिकांश पद ऐसी स्थिति में होता है जो अंततः ट्री को प्राप्त करता है $d$-एरी ट्री, और उन पदोंं के लिए कोई नीचे की ओर स्वैपिंग नहीं की जाती है। अधिक से अधिक $n/d + 1$ पद गैर-ट्री होते है, और इन्हें कम से कम एक बार नीचे की ओर बदला जा सकता है $O(d)$ उनकी अदला-बदली के लिए चाइल्ड को प्राप्त किया जाता है। अधिक से अधिक $n/d^{2} + 1$ नोड्स को दो बार नीचे की ओर स्वैप किया जा सकता है, जिससे अतिरिक्त समय होता है $O(d)$ दूसरे स्वैप के पहले से ही गणना का समय अधिक होता है। इसलिए, इस तरह से हीप बनाने में लगने वाला कुल समय है
 * $$\sum_{i=1}^{\log_d n} \left(\frac{n}{d^i}+1\right) O(d) = O(n).$$

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

जहां sd n और e के मानक आधार-डी प्रतिनिधित्व के सभी अंकों का योग है (n) nd इसके गुणन में d घातांक है।
 * $$ \frac{d}{d-1} (n - s_d (n)) - (d-1 - (n \bmod  d)) \left( e_d \left( \left\lfloor \frac{n}{d} \right\rfloor\right) + 1\right) $$,

इससे यह कम हो जाता है
 * $$ 2 n - 2 s_2 (n) - e_2 (n) $$, d = 2, और के लिए
 * $$ \frac{3}{2} (n - s_3 (n)) - 2 e_3 (n) - e_3 (n-1) $$,

डी = 3 के लिए.

इस स्थान का उपयोग $d-ary$ हीप, इन्सर्ट और डिलीट-मिन ऑपरेशंस के साथ, रैखिक है, क्योंकि यह हीप में पदों की सूची वाली सरणी के अतिरिक्त किसी अतिरिक्त स्टोरेज का उपयोग नहीं करता है। यदि उपस्थित पदोंं की प्राथमिकताओं में परिवर्तन का समर्थन करने की आवश्यकता है, तो पदोंं से हीप में उनकी स्थिति तक पॉइंटर्स भी बनाए रखना होता है, जो केवल रैखिक स्टोरेज का उपयोग करता है।

अनुप्रयोग
ग्राफ़ (गणित) पर काम करते समय $m$किनारे और $n$ कोने में, सबसे छोटे पथों के लिए दिज्क्स्ट्रा का एल्गोरिदम और न्यूनतम फैले हुए ट्री के लिए मुख्य एल्गोरिदम दोनों एक न्यूनतम-हीप का उपयोग करते है जिसमें है $n$ डिलीट-मिन ऑपरेशंस और प्राथमिकता संचालन $m$। ए का उपयोग करके $d$-एरी हीप के साथ $d = m/n$, इन दो प्रकार के परिचालनों के लिए कुल समय को एक-दूसरे के विरुद्ध संतुलित किया जा सकता है, जिससे कुल समय प्राप्त हो सकता है $O(m log_{m/n} n)$ एल्गोरिथम के लिए, इसमे $O(m log n)$ जब भी किनारों की संख्या शीर्षों की संख्या से अधिक बड़ी होती है, तो एल्गोरिदम के बाइनरी हीप संस्करणों का समय होता है। एक वैकल्पिक प्राथमिकता डेटा संरचना, फाइबोनैचि हीप, और भी बेहतर सैद्धांतिक चलने का समय देता है $O(m + n log n)$, लेकिन व्यवहार में $d$-एरी हीप सामान्यतः इस एप्लिकेशन के लिए फाइबोनैचि हीप्स की तुलना में अधिकांशतः तेज़ होते है।

व्यवहार में 4-हीप्स बाइनरी हीप्स से बेहतर प्रदर्शन कर सकते है, यहां तक ​​कि डिलीट-मिन ऑपरेशन के लिए भी बेहतर प्रदर्शन कर सकते है। इसके अतिरिक्त, ए $d$-एरी हीप सामान्यतः कंप्यूटर की कैश मैमोरी के आकार से अधिक के हीप आकारों के लिए बाइनरी हीप की तुलना में बहुत तेजी से चलता है: एक बाइनरी हीप के लिए सामान्यतः एक की तुलना में अधिक कैश मिस और आभासी मेमोरी पेज दोष की आवश्यकता होती है $d$-एरी हीप, प्रत्येक अतिरिक्त तुलना द्वारा किए गए अतिरिक्त कार्य की तुलना में कहीं अधिक समय लेता है $d$-एरी हीप की तुलना बाइनरी हीप से की जाती है।

बाहरी संबंध

 * C++ implementation of generalized heap with D-Heap support