बूस्ट सी ++ पुस्तकालयों में फिबोनैकी ढेर के एक कार्यान्वयन शामिल boost/pending/fibonacci_heap.hpp
। यह फ़ाइल स्पष्ट रूप से pending/
वर्षों से है और मेरे अनुमानों के अनुसार कभी स्वीकार नहीं की जाएगी। इसके अलावा, उस कार्यान्वयन में कीड़े हो गए हैं, जो मेरे परिचित और सभी शांत आदमी आरोन विंडसर द्वारा तय किए गए थे। दुर्भाग्य से, उस फ़ाइल के अधिकांश संस्करण जिन्हें मैं ऑनलाइन पा सकता था (और उबंटू के लिबासोस्ट-डी पैकेज में एक) अभी भी बग था; मुझे तोड़फोड़ भंडार से एक साफ संस्करण खींचना था ।
संस्करण 1.49 के बाद से बूस्ट सी ++ पुस्तकालयों ने बहुत सी नई ढेर संरचनाएं जोड़ दीं, जिसमें रिट्रेसमेंट ढेर भी शामिल हैं।
मैं संकलन करने में सक्षम था dijkstra_heap_performance.cpp का एक संशोधित संस्करण के खिलाफ dijkstra_shortest_paths.hpp फिबोनैकी ढेर और बाइनरी ढेर तुलना करने के लिए। (लाइन में typedef relaxed_heap<Vertex, IndirectCmp, IndexMap> MutableQueue
, परिवर्तन relaxed
करें fibonacci
।) मैं पहले अनुकूलन के साथ संकलित करना भूल गया, जिस स्थिति में फाइबोनैचि और बाइनरी हीप्स लगभग उसी के बारे में प्रदर्शन करते हैं, फाइबोनैचि ढेर के साथ आमतौर पर एक तुच्छ राशि द्वारा आउटपरफॉर्मिंग करते हैं। जब मैंने बहुत मजबूत अनुकूलन के साथ संकलित किया, तो बाइनरी हीप्स को भारी बढ़ावा मिला। मेरे परीक्षणों में, फिबोनासी ढेर केवल द्विआधारी हीप्स को ढेर करता है, जब ग्राफ अविश्वसनीय रूप से बड़ा और घना होता था, जैसे:
Generating graph...10000 vertices, 20000000 edges.
Running Dijkstra's with binary heap...1.46 seconds.
Running Dijkstra's with Fibonacci heap...1.31 seconds.
Speedup = 1.1145.
जहां तक मैं समझता हूं, यह फाइबोनैचि हीप्स और बाइनरी हीप्स के बीच मूलभूत अंतरों को छूता है। दो डेटा संरचनाओं के बीच एकमात्र वास्तविक सैद्धांतिक अंतर यह है कि फाइबोनैचि हीप लगातार समय में (amortized) में कमी-कुंजी का समर्थन करता है। दूसरी ओर, बाइनरी हीप्स एक सरणी के रूप में उनके कार्यान्वयन से बहुत अच्छा प्रदर्शन प्राप्त करते हैं; एक स्पष्ट सूचक संरचना का उपयोग करने का मतलब है कि फिबोनाची ढेर एक विशाल प्रदर्शन हिट है।
इसलिए, व्यवहार में फाइबोनैचि हीप्स से लाभ उठाने के लिए , आपको उन्हें एक ऐसे एप्लिकेशन में उपयोग करना होगा, जहां कमी_की अविश्वसनीय रूप से अक्सर होती है। दिज्क्स्त्र के संदर्भ में, इसका अर्थ है कि अंतर्निहित ग्राफ़ सघन है। कुछ अनुप्रयोगों में आंतरिक रूप से कमी_की-तीव्र हो सकती है; मैं नागोमोची-इबाराकी न्यूनतम-कट एल्गोरिथ्म की कोशिश करना चाहता था क्योंकि जाहिर तौर पर यह बहुत सारे घट__ उत्पन्न करता है, लेकिन यह एक समय तुलनात्मक कार्य करने के लिए बहुत अधिक प्रयास था।
चेतावनी : मैंने कुछ गलत किया होगा। आप स्वयं इन परिणामों को पुन: प्रस्तुत करने का प्रयास कर सकते हैं।
सैद्धांतिक नोट : डिब्बों के लिए फिबोनाची ढेर का बेहतर प्रदर्शन सैद्धांतिक अनुप्रयोगों के लिए महत्वपूर्ण है, जैसे कि दिज्कस्ट्रा का रनटाइम। फाइबोनैचि ढेर भी सम्मिलन और विलय पर द्विआधारी ढेर को नष्ट कर देते हैं (दोनों फाइबोनैचि ढेर के लिए निरंतर-समय में परिशोधन करते हैं)। सम्मिलन अनिवार्य रूप से अप्रासंगिक है, क्योंकि यह दिज्क्स्ट्रा के रनटाइम को प्रभावित नहीं करता है, और द्विआधारी ढेर को संशोधित करने के लिए काफी आसान है जो कि निरंतर समय में सम्मिलित होता है। निरंतर समय में विलय शानदार है, लेकिन इस एप्लिकेशन के लिए प्रासंगिक नहीं है।
व्यक्तिगत टिप्पणी : मेरा एक दोस्त और मैंने एक बार एक नई प्राथमिकता कतार की व्याख्या करते हुए एक पत्र लिखा था, जिसमें उनकी जटिलता के बिना फिबोनाची ढेर के समय (सैद्धांतिक) को दोहराने की कोशिश की गई थी। पेपर कभी भी प्रकाशित नहीं हुआ था, लेकिन मेरे कोथोर ने डेटा संरचनाओं की तुलना करने के लिए बाइनरी हीप्स, फाइबोनैचि हीप्स और हमारी अपनी प्राथमिकता कतार को लागू किया। प्रायोगिक परिणामों के रेखांकन से पता चलता है कि फाइबोनैचि कुल तुलना के मामले में थोड़ा बाहर से किए गए द्विआधारी ढेर को दर्शाता है, यह सुझाव देते हुए कि फाइबोनैचि ढेर ऐसी स्थिति में बेहतर प्रदर्शन करेगा जहां तुलना लागत ओवरहेड से अधिक हो। दुर्भाग्य से, मेरे पास कोड उपलब्ध नहीं है, और संभवतः आपकी स्थिति में तुलना सस्ता है, इसलिए ये टिप्पणियां प्रासंगिक हैं लेकिन सीधे लागू नहीं हैं।
संयोग से, मैं अत्यधिक अपने स्वयं के डेटा संरचना के साथ फिबोनाची ढेर के क्रम से मेल खाने की कोशिश कर रहा हूं। मैंने पाया कि मैंने सिर्फ़ फिबोनाची को फिर से पाला है। इससे पहले कि मुझे लगता है कि फाइबोनैचि ढेर की सभी जटिलताएं कुछ यादृच्छिक विचार थे, लेकिन बाद में मुझे एहसास हुआ कि वे सभी प्राकृतिक और काफी मजबूर थे।