फाइबोनैचि हीप

कंप्यूटर विज्ञान में, फाइबोनैचि हीप प्राथमिकता पंक्ति संचालन के लिए डेटा संरचना होती है, जिसमें हीप (डेटा संरचना) होती है| हीप-क्रमांक किए गए ट्री का संग्रह सम्मिलित होता है। इसमें बाइनरी हीप और द्विपद हीप सहित कई अन्य प्राथमिकता पंक्ति  डेटा संरचनाओं की तुलना में श्रेष्ट परिशोधित विश्लेषण कार्यकारी समय होता है। माइकल एल. फ्रेडमैन और रॉबर्ट ई. टार्जन ने 1984 में फाइबोनैचि हीप विकसित किया और उन्हें 1987 में वैज्ञानिक पत्रिका में प्रकाशित किया था। फाइबोनैचि हीप का नाम फाइबोनैचि संख्याओं के नाम पर रखा गया है, जिनका उपयोग उनके चलने के समय के विश्लेषण में किया जाता है।

फाइबोनैचि हीप के लिए, अन्वेषण -न्यूनतम कार्यवाही में स्थिर (बिग ओ अंकन(1)) परिशोधित समय लगता है। सम्मिलित करना और घटाना कुंजी संचालन में भी निरंतर परिशोधन समय में काम करते हैं। किसी तत्व को हटाना (अधिकांशतः न्यूनतम तत्व को हटाने के विशेष स्थिति  में उपयोग किया जाता है) O(log n) परिशोधन समय में काम करता है, जहां n हीप का आकार होता है। इसका अर्थ  यह है कि खाली डेटा संरचना से प्रारम्भ करके, सम्मिलित करने और कुंजी संचालन को कम करने और b विलोपन संचालन के किसी भी अनुक्रम में ओ O(a + b log n) सबसे व्यर्थ स्थिति का समय लगेगा, जहाँ  n अधिकतम हीप आकार होता है। द्विआधारी या द्विपद हीप में, संचालन के ऐसे अनुक्रम में O((a + b) log n) समय लगेगा। इस प्रकार फाइबोनैचि हीप बाइनरी या द्विपद हीप से श्रेष्ट  होता है जब b गैर-स्थिर कारक से छोटा होता है। दो फाइबोनैचि हीपों को निरंतर परिशोधन समय में विलय  करना, द्विपद हीप के लघुगणकीय विलय समय में सुधार करना और बाइनरी हीपों में सुधार करना भी संभव है जो विलय को कुशलता से संभाल नहीं सकते हैं।

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

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

यघपि, कुछ बिंदु पर वांछित कार्यकारी समय प्राप्त करने के लिए हीप में क्रमांक प्रस्तुत करने की आवश्यकता होती है। विशेष रूप से, नोड्स की डिग्री (यहां डिग्री का अर्थ सीधे बच्चों की संख्या है) को अधिक कम रखा जाता है: प्रत्येक नोड में अधिकतम log n पर डिग्री होती है और डिग्री के नोड में निहित उपट्री का आकार कम से कम Fk+2 होता है, जहां Fk kth फाइबोनैचि संख्या होती है।  यह इस नियम से प्राप्त होता है कि हम प्रत्येक गैर-रूट नोड के अधिकतम चाइल्ड  को हटा सकते हैं। जब दूसरे चाइल्ड को हटा दिया जाता है, तो नोड को अपने पैरेंट से पृथक् होना पड़ता है और नए ट्री  की रूट  बन जाती है (डिग्री सीमा का प्रमाण नीचे देखें)। कार्यवाही विलोपन न्यूनतम में ट्री की संख्या कम हो जाती है, जहां ट्री को साथ जोड़ा जाता है।

सुविधाजनक संरचना के परिणामस्वरूप, कुछ कार्यवाहीों में अधिक समय लग सकता है जबकि अन्य बहुत शीघ्रता से किए जाते हैं। परिशोधित विश्लेषण विश्लेषण के लिए, हम संभावित विधि का उपयोग करते हैं, इसमें हम दिखावा करते हैं कि बहुत शीघ्र संचालन वास्तव में करने की तुलना में थोड़ा अधिक समय लेते हैं। इस अतिरिक्त समय को पश्चात्  में जोड़ दिया जाता है और धीमे संचालन के वास्तविक चलने के समय से घटा दिया जाता है। पश्चात् में उपयोग के लिए बचाए गए समय की मात्रा को किसी भी क्षण संभावित फलन द्वारा मापा जाता है। फाइबोनैचि हीप की क्षमता किसके द्वारा दी गई है?


 * संभाव्यता = t + 2m

जहां t फाइबोनैचि हीप में ट्री की संख्या होती है, और m चिह्नित नोड्स की संख्या होती है। नोड को चिह्नित किया जाता है यदि उसके कम से कम चाइल्ड को हटा  दिया गया हो क्योंकि इस नोड को दूसरे नोड का चाइल्ड बना दिया गया था (सभी रूट अचिह्नित हैं)। किसी  कार्यवाही के लिए परिशोधन समय वास्तविक समय के योग और क्षमता में अंतर के c गुना द्वारा दिया जाता है, जहां c स्थिरांक होता है (वास्तविक समय के लिए O अंकन में स्थिर कारकों से समरूप होने के लिए चुना गया है)।

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

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

कार्यवाही फाइंड मिनिमम अब तुच्छ हो गया है क्योंकि हम पॉइंटर को उस नोड पर रखते हैं जिसमें यह सम्मिलित है। यह हीप की क्षमता को नहीं बदलता है, इसलिए वास्तविक और परिशोधित लागत दोनों स्थिर हैं।

जैसा कि ऊपर उल्लेख किया गया है, विलय को मात्र  दो हीपों के ट्री  की रूट ों की सूचियों को जोड़कर लागू किया जाता है। यह निरंतर समय में किया जा सकता है और क्षमता नहीं बदलती है, जिससे फिर से निरंतर परिशोधन समय हो जाता है।

कार्यवाही इंसर्ट तत्व के साथ नया हीप बनाकर और विलय करके काम करता है। इसमें निरंतर समय लगता है, और क्षमता से बढ़ जाती है, क्योंकि ट्री  की संख्या बढ़ जाती है। इस प्रकार परिशोधन लागत अभी भी स्थिर है।

कार्यवाही एक्सट्रेक्ट मिनिमम ('विलोपन मिनिमम' के समान) तीन चरणों में संचालित होता है। सबसे पहले हम न्यूनतम तत्व वाला मूल लेते हैं और उसे हटा देते हैं। इसके चाइल्ड नये वृक्षों की रूट ें बनेंगे। यदि बच्चों की संख्या d थी, तो सभी नई रूट ों को संसाधित करने में O(d) समय लगता है और क्षमता d−1 तक बढ़ जाती है। इसलिए, इस चरण का परिशोधन चलने का समय O(d) = O(log n) है।

हालाँकि, एक्सट्रेक्ट मिनिमम कार्यवाही को पूरा करने के लिए, हमें पॉइंटर को न्यूनतम कुंजी के साथ रूट पर अपडेट करना होगा। दुर्भाग्य से एन तक रूट ें हो सकती हैं जिनकी हमें जांच करने की आवश्यकता है। इसलिए दूसरे चरण में हम समान डिग्री की रूट ों को क्रमिक रूप से साथ जोड़कर रूट ों की संख्या कम करते हैं। जब दो रूट ों u और v की डिग्री समान होती है, तो हम उनमें से को दूसरे की संतान बनाते हैं ताकि छोटी कुंजी वाला मूल बना रहे। इसकी डिग्री से बढ़ जाएगी. इसे तब तक दोहराया जाता है जब तक कि प्रत्येक रूट की अलग-अलग डिग्री न हो जाए। समान डिग्री के ट्री  को कुशलतापूर्वक अन्वेषण ने के लिए हम ओ (लॉग एन) लंबाई की सरणी का उपयोग करते हैं जिसमें हम प्रत्येक डिग्री के मूल के लिए संकेतक रखते हैं। जब समान डिग्री का दूसरा रूट पाया जाता है, तो दोनों जुड़े होते हैं और एरे को अपडेट किया जाता है। वास्तविक चलने का समय O (लॉग n + m) है जहां m दूसरे चरण की शुरुआत में रूट ों की संख्या है। अंत में हमारे पास अधिकतम O(log n) मूल होंगे (क्योंकि प्रत्येक की अलग डिग्री होती है)। इसलिए, इस चरण के पहले से लेकर इसके पश्चात्  तक संभावित फलन  में अंतर है: ओ(लॉग एन) - एम, और परिशोधित चलने का समय अधिकतम ओ है '(लॉग एन + एम) + सी(ओ(लॉग एन) - एम)। सी के पर्याप्त बड़े विकल्प के साथ, यह ओ(लॉग एन) तक सरल हो जाता है।

तीसरे चरण में हम प्रत्येक शेष मूल की जाँच करते हैं और न्यूनतम ज्ञात करते हैं। इसमें O(log n) समय लगता है और विभव नहीं बदलता है। इसलिए न्यूनतम निकालने का कुल परिशोधन समय O(लॉग एन) है।

कार्यवाही 'कमी कुंजी' नोड लेगा, कुंजी को कम करेगा और यदि हीप गुण का उल्लंघन हो जाता है (नई कुंजी मूल की कुंजी से छोटी है), तो नोड को उसके मूल से हटा  दिया जाता है। यदि अभिभावक मूल नहीं है, तो इसे चिह्नित किया जाता है। यदि इसे पहले से ही चिह्नित किया गया है, तो इसे भी हटा  दिया जाता है और इसके मूल को चिह्नित किया जाता है। हम तब तक ऊपर की ओर बढ़ते रहते हैं जब तक हम मूल या अचिह्नित नोड तक नहीं पहुंच जाते। अब हम न्यूनतम सूचक को घटे हुए मान पर सेट करते हैं यदि यह नया न्यूनतम है। इस प्रक्रिया में हम नए ट्री  की कुछ संख्या, मान लीजिए k, बनाते हैं। संभवतः पहले ट्री  को छोड़कर इनमें से प्रत्येक नए ट्री  को मूल रूप से चिह्नित किया गया था, लेकिन रूट  के रूप में यह अचिह्नित हो जाएगा। नोड चिह्नित किया जा सकता है. इसलिए, चिह्नित नोड्स की संख्या −(k − 1) −+ 1 − = − −k −2 से बदल जाती है। इन 2 परिवर्तनों को मिलाकर, संभावित 2(−k − 2) − −k − − −k − 4 − 4 से बदल जाती है। वास्तविक समय कटिंग करने के लिए ओ(के) था, इसलिए (फिर से सी के पर्याप्त बड़े विकल्प के साथ) परिशोधन चलने का समय स्थिर है।

अंत में, कार्यवाही 'विलोपन' को हटाए जाने वाले तत्व की कुंजी को शून्य से अनंत तक कम करके कार्यान्वित किया जा सकता है, इस प्रकार इसे पूरे हीप के न्यूनतम में बदल दिया जा सकता है। फिर हम इसे हटाने के लिए एक्सट्रैक्ट मिनिमम कहते हैं। इस  कार्यवाही का परिशोधन चलने का समय O(लॉग एन) है।

डिग्री सीमा का प्रमाण
फाइबोनैचि हीप का परिशोधन प्रदर्शन किसी भी ट्री की रूट  की डिग्री (बच्चों की संख्या) ओ (लॉग एन) पर निर्भर करता है, जहां एन हीप का आकार है। यहां हम दिखाते हैं कि हीप में डिग्री डी के किसी भी नोड x पर रूट े (उप) ट्री  का आकार कम से कम एफ होना चाहिएd+2, जहां एफkkth फाइबोनैचि संख्या है. डिग्री की बाध्यता इस और तथ्य (आसानी से प्रेरण द्वारा सिद्ध) से अनुसरण करती है $$F_{d+2} \ge \varphi^d$$ सभी पूर्णांकों के लिए $$d\ge 0$$, कहाँ $$\varphi = (1+\sqrt 5)/2 \doteq 1.618$$. (तब हमारे पास है $$n \ge F_{d+2} \ge \varphi^d$$, और लॉग को आधार पर ले जाना $$\varphi$$ दोनों पक्षों का देता है $$d\le \log_{\varphi} n$$ आवश्यकता अनुसार।)

हीप में कहीं किसी भी नोड x पर विचार करें (x को मुख्य ट्री में से की रूट  होने की आवश्यकता नहीं है)। 'आकार'(x) को x पर रूट े ट्री  के आकार के रूप में परिभाषित करें (x के वंशजों की संख्या, जिसमें स्वयं x भी सम्मिलित है)। हम x की ऊंचाई (x से वंशज पत्ती तक के सबसे लंबे सरल पथ की लंबाई) पर प्रेरण द्वारा साबित करते हैं कि 'आकार' (x) ≥ Fd+2, जहां d x की डिग्री है।

'बेस केस:' यदि x की ऊंचाई 0 है, तो d = 0, और 'आकार'(x) = 1 = F2.

आगमनात्मक मामला: मान लीजिए x की ऊंचाई सकारात्मक है और डिग्री d > 0 है। मान लीजिए y1, और2, ..., औरdx के चाइल्ड हों, उन्हें उस समय के क्रम में अनुक्रमित किया जाए जब वे हाल ही में x (y) के चाइल्ड  बने थे1 सबसे पहले और वाई होने के नातेdनवीनतम), और चलो सी1, सी2, ..., सीdउनकी संबंधित डिग्री हो. हम 'दावा' करते हैं कि सीi≥ i-2 प्रत्येक i के लिए 2 ≤ i ≤ d के साथ: y से ठीक पहलेix, y का बच्चा बना दिया गया1,...,औरi−1 वे पहले से ही x के चाइल्ड  थे, और इसलिए x के पास उस समय कम से कम i−1 की डिग्री थी। चूँकि वृक्षों का संयोजन तभी होता है जब उनकी रूट ों की डिग्री समान होती है, इसलिए ऐसा अवश्य हुआ होगाiजब वह x का बच्चा बना तो उसके पास कम से कम i-1 डिग्री भी थी। उस समय से लेकर आज तक, यiअधिकतम मात्र  बच्चा ही खोया जा सकता है (जैसा कि अंकन प्रक्रिया द्वारा गारंटी दी गई है), और इसलिए इसकी वर्तमान डिग्री सीiकम से कम i−2 है. इससे 'दावा' साबित होता है.

चूँकि सभी y की ऊँचाइयाँix की तुलना में बिल्कुल कम हैं, हम 'आकार'(y) प्राप्त करने के लिए उन पर आगमनात्मक परिकल्पना लागू कर सकते हैंi) ≥एफc i+2≥एफ(i−2)+2= एफi. नोड्स x और y1 प्रत्येक आकार(x) में कम से कम 1 योगदान देता है, और इसलिए हमारे पास है

$$\textbf{size}(x) \ge 2 + \sum_{i=2}^d \textbf{size}(y_i) \ge 2 + \sum_{i=2}^d F_i = 1 + \sum_{i=0}^d F_i.$$ नियमित प्रेरण यह साबित करता है $$1 + \sum_{i=0}^d F_i = F_{d+2}$$ किसी के लिए $$d\ge 0$$, जो आकार (x) पर वांछित निचली सीमा देता है।

सबसे ख़राब मामला
हालाँकि फाइबोनैचि हीप बहुत कुशल दिखते हैं, उनमें निम्नलिखित दो कमियाँ हैं:
 * 1) जब इन्हें लागू करने की बात आती है तो ये जटिल हो जाते हैं।
 * 2) हीप के सैद्धांतिक रूप से कम कुशल रूपों की तुलना में वे व्यवहार में उतने कुशल नहीं हैं। अपने सरलतम संस्करण में उन्हें प्रति नोड चार पॉइंटर्स के भंडारण और हेरफेर की आवश्यकता होती है, जबकि अन्य संरचनाओं में प्रति नोड मात्र  दो या तीन पॉइंटर्स की आवश्यकता होती है, जैसे कि बाइनरी हीप, बाइनोमियल हीप, युग्मन हीप, ब्रोडल पंक्ति  और रैंक पेयरिंग हीप।

यद्यपि खाली संरचना से प्रारम्भ  होने वाले संचालन के अनुक्रम का कुल चलने का समय ऊपर दी गई सीमाओं से घिरा हुआ है, अनुक्रम में कुछ (बहुत कम) संचालन को पूरा होने में बहुत लंबा समय लग सकता है (विशेष रूप से हटाएं और हटाएं में न्यूनतम रैखिक चलने का समय होता है) सबसे ख़राब मामला)। इस कारण से फाइबोनैचि हीप और अन्य परिशोधित डेटा संरचनाएं वास्तविक समय कंप्यूटिंग | वास्तविक समय प्रणालियों के लिए उपयुक्त नहीं हो सकती हैं। ऐसी डेटा संरचना बनाना संभव है जिसका प्रदर्शन उतना ही खराब हो जितना कि फाइबोनैचि हीप का परिशोधित प्रदर्शन। ऐसी ही संरचना, ब्रोडल पंक्ति, , रचनाकार के शब्दों में, काफी जटिल है और व्यवहार में लागू नहीं होता है। 2012 में बनाया गया, सख्त फाइबोनैचि हीप रेफरी> समान सबसे खराब स्थिति वाली सरल (ब्रोडल की तुलना में) संरचना है। सरल संरचना होने के बावजूद, प्रयोगों से पता चलता है कि व्यवहार में सख्त फाइबोनैचि हीप अधिक जटिल ब्रोडल पंक्ति  की तुलना में धीमा प्रदर्शन करता है और बुनियादी फाइबोनैचि हीप की तुलना में भी धीमा है। रेफरी>X ड्रिस्कॉल एट अल के रन-रिलैक्स्ड हीप। विलय  को छोड़कर सभी फाइबोनैचि हीप संचालन के लिए सबसे खराब स्थिति में अच्छा प्रदर्शन दें।

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

बाहरी संबंध

 * Java applet simulation of a Fibonacci heap
 * MATLAB implementation of Fibonacci heap
 * De-recursived and memory efficient C implementation of Fibonacci heap (free/libre software, CeCILL-B license)
 * Ruby implementation of the Fibonacci heap (with tests)
 * Pseudocode of the Fibonacci heap algorithm
 * Various Java Implementations for Fibonacci heap