क्या किसी ने वास्तव में एक फाइबोनैचि-हीप को कुशलता से लागू किया है?


151

क्या आप में से किसी ने कभी एक फिबोनाची-ढेर लागू किया है ? मैंने कुछ साल पहले ऐसा किया था, लेकिन यह सरणी-आधारित BinHeaps का उपयोग करने की तुलना में परिमाण की धीमी गति के कई आदेश थे।

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

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


25
क्या आपने नहीं सीखा कि ये एल्गोरिथ्म के दोस्त हमेशा अपने बड़े ओह के पीछे अपने विशाल स्थिरांक को छिपाते हैं ?! :) यह व्यवहार में लगता है, ज्यादातर समय, "n" चीज कभी भी "n0" के करीब नहीं जाती है!
मेहरदाद अफशरी 20

मुझे अब पता चला। मैंने इसे तब लागू किया जब मुझे पहली बार "इंट्रोडक्शन टू अल्गोरिदम" की मेरी कॉपी मिली। इसके अलावा, मैंने टारजन को किसी ऐसे व्यक्ति के लिए नहीं चुना, जो बेकार डेटा-संरचना का आविष्कार करेगा, क्योंकि उसके सेपले-ट्री वास्तव में काफी अच्छे हैं।
mdm

mdm: बेशक यह बेकार नहीं है, लेकिन सिर्फ प्रविष्टि सॉर्ट की तरह जो छोटे डेटा सेट में क्विकॉर्ट को धड़कता है, बाइनरी हीप छोटे स्थिरांक के कारण बेहतर काम कर सकता है।
मेहरदाद अफशरी 21

1
दरअसल, जिस प्रोग्राम के लिए मुझे ढेर की जरूरत थी, वह वीएलएसआई-चिप्स में राउटिंग के लिए स्टेनर-ट्रीज़ ढूंढ रहा था, इसलिए डेटा सेट बिल्कुल छोटे नहीं थे। लेकिन आजकल (सिंपल सामान को छाँटने की तरह छोड़कर) मैं हमेशा सिंपल एल्गोरिथ्म का उपयोग करता हूँ जब तक कि यह डेटा-सेट पर "टूट" न जाए।
mdm

1
इस पर मेरा जवाब वास्तव में "हाँ" है। (ठीक है, एक कागज पर मेरे कोआथोर ने किया।) मेरे पास अभी कोड नहीं है, इसलिए मुझे वास्तव में जवाब देने से पहले अधिक जानकारी मिलेगी। हमारे ग्राफ को देखते हुए, हालांकि, मैं ध्यान देता हूं कि एफ हीप बी हीप की तुलना में कम तुलना करते हैं। क्या आप कुछ का उपयोग कर रहे थे, जहां तुलना करना सस्ता था?
ए रेक्स

जवाबों:


136

बूस्ट सी ++ पुस्तकालयों में फिबोनैकी ढेर के एक कार्यान्वयन शामिल 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) में कमी-कुंजी का समर्थन करता है। दूसरी ओर, बाइनरी हीप्स एक सरणी के रूप में उनके कार्यान्वयन से बहुत अच्छा प्रदर्शन प्राप्त करते हैं; एक स्पष्ट सूचक संरचना का उपयोग करने का मतलब है कि फिबोनाची ढेर एक विशाल प्रदर्शन हिट है।

इसलिए, व्यवहार में फाइबोनैचि हीप्स से लाभ उठाने के लिए , आपको उन्हें एक ऐसे एप्लिकेशन में उपयोग करना होगा, जहां कमी_की अविश्वसनीय रूप से अक्सर होती है। दिज्क्स्त्र के संदर्भ में, इसका अर्थ है कि अंतर्निहित ग्राफ़ सघन है। कुछ अनुप्रयोगों में आंतरिक रूप से कमी_की-तीव्र हो सकती है; मैं नागोमोची-इबाराकी न्यूनतम-कट एल्गोरिथ्म की कोशिश करना चाहता था क्योंकि जाहिर तौर पर यह बहुत सारे घट__ उत्पन्न करता है, लेकिन यह एक समय तुलनात्मक कार्य करने के लिए बहुत अधिक प्रयास था।

चेतावनी : मैंने कुछ गलत किया होगा। आप स्वयं इन परिणामों को पुन: प्रस्तुत करने का प्रयास कर सकते हैं।

सैद्धांतिक नोट : डिब्‍बों के लिए फिबोनाची ढेर का बेहतर प्रदर्शन सैद्धांतिक अनुप्रयोगों के लिए महत्वपूर्ण है, जैसे कि दिज्कस्ट्रा का रनटाइम। फाइबोनैचि ढेर भी सम्मिलन और विलय पर द्विआधारी ढेर को नष्ट कर देते हैं (दोनों फाइबोनैचि ढेर के लिए निरंतर-समय में परिशोधन करते हैं)। सम्मिलन अनिवार्य रूप से अप्रासंगिक है, क्योंकि यह दिज्क्स्ट्रा के रनटाइम को प्रभावित नहीं करता है, और द्विआधारी ढेर को संशोधित करने के लिए काफी आसान है जो कि निरंतर समय में सम्मिलित होता है। निरंतर समय में विलय शानदार है, लेकिन इस एप्लिकेशन के लिए प्रासंगिक नहीं है।

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

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


धन्यवाद! यह सवाल लंबे समय से मेरे दिमाग में बैठा था। इससे पहले कि मैं स्टाइनर-ट्रीज़ का प्रयास करता, मैंने वास्तव में डिजास्क्राट को फाइबोनैचि-हीप्स का उपयोग करके लागू किया। हालाँकि, ऐसा लगता है कि मेरे रेखांकन जहाँ आपके उदाहरण की तुलना में बहुत कम घने हैं। उनके पास लाखों नोड्स थे, लेकिन केवल 5-6 की औसत डिग्री।
mdm

संचालन के अनुक्रम के माध्यम से फाइब हीप का प्रदर्शन अनुमानित है। मैंने एक ढेर-भारी एल्गोरिथ्म लिखा है, जो कि फब हीप (बनाम बिन हीप) के साथ तेजी से समाप्त हो गया है। चाल काम को बैचेन कर रही थी। किसी भी ऑपरेशन की आवृत्ति के बावजूद, अंतर यहां है: DecreaseKey - ExtractMin - DecreaseKey - ExtractMin बनाम DecreaseKey - DecreaseKey - ExtractMin - ExtractMin (contd। नीचे)
Gaminic

उत्तरार्द्ध लगभग दो बार तेजी से होगा, क्योंकि दूसरा एक्सट्रैक्टमिन लगभग मुफ्त है। हमारा एल्गोरिथ्म न्यूनतम तत्वों का एक बैच निकालता है जिसमें से कई को त्याग दिया जाता है; एक बिन हीप पर अपशिष्ट, लेकिन एक फ़िब ढेर पर बेहतर है। दुख की बात है कि यह उस समय जटिलता में स्पष्ट रूप से परिलक्षित नहीं होता है जब लोग हीप-आधारित एल्गोरिदम के बारे में बात करते हैं। परिशोधित सीमा के साथ, कुल जटिलता बस # संचालन * ऑपरेशन की जटिलता नहीं है।
जामिनिक

1
भी जोड़ी ढेर और / या आराम ढेर कोशिश कर रहा का कोई मौका?
थॉमस अहले

1
मुझे यकीन नहीं है कि आपके परिणाम इतने करीब क्यों दिखाई दिए, मैंने एसटीएल प्राथमिकता_काले बनाम स्व-कार्यान्वित रिटेलर हीप का इस्तेमाल किया और बाइनरी हीप मेरे परीक्षणों में बड़े अंतर से पीछे था ।
निकोलस पिपिटोन

33

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

स्रोत कोड (बल्कि CWEB जो सी, गणित और टेक्स के बीच संकर है या) अनुभाग MILES_SPAN में सी में है।


1

अस्वीकरण

मुझे पता है कि परिणाम काफी समान हैं और "ऐसा लग रहा है कि दौड़ने का समय पूरी तरह से ढेर के अलावा कुछ और हावी है" (@Alpedar)। लेकिन मुझे उस कोड में कुछ भी सबूत नहीं मिला। यह कोड खुला है, इसलिए यदि आप कुछ भी पा सकते हैं जो परीक्षा के परिणाम को प्रभावित कर सकता है, तो कृपया मुझे बताएं।


हो सकता है कि मैंने कुछ गलत किया था, लेकिन मैं एक परीक्षण लिखा था पर आधारित है, A.Rex anwser की तुलना:

  • फाइबोनैचि-ढेर
  • डी-आर्य-ढेर (4)
  • बाइनरी-ढेर
  • ढील-ढेर

सभी ढेर के लिए निष्पादन का समय (केवल पूर्ण रेखांकन के लिए) बहुत करीब था। परीक्षण पूर्ण रेखांकन के लिए 1000,2000,3000,4000,5000,6000,7000 और 8000 कोने के साथ किया गया था। प्रत्येक परीक्षण के लिए 50 रैंडम ग्राफ तैयार किए गए थे और आउटपुट प्रत्येक ढेर का औसत समय है:

आउटपुट के बारे में क्षमा करें, यह बहुत क्रियात्मक नहीं है क्योंकि मुझे पाठ फ़ाइलों से कुछ चार्ट बनाने के लिए इसकी आवश्यकता थी।


यहां परिणाम (सेकंड में) हैं:

हीप रिजल्ट टेबल


4
प्रत्येक मामले में कितने किनारे हैं? और आप किस एल्गोरिथ्म में चल रहे हैं? यदि हम नहीं जानते कि हम क्या कर रहे हैं, तो आपके परिणामों का कोई मतलब नहीं है।
कोकजे

जैसा कि मैं दुखी हूं, सभी ग्राफ पूर्ण हैं, इसलिए आप प्रत्येक मामले के लिए किनारों की संख्या की गणना कर सकते हैं। आपका क्या मतलब है, "क्या आप ठीक चल रहे हैं"। वे तालिकाओं के प्रमुख में हैं।
गुइलहर्मे टोरेस कास्त्रो

22
ऐसा लग रहा है कि दौड़ने का समय पूरी तरह से ढेर के अलावा किसी और चीज़ पर हावी है (यह ग्राफ या कुछ IO का उत्पादन हो सकता है)। लगभग वही परिणाम अविश्वसनीय हैं।
अल्पेन्द्र

2
अच्छी तरह से शायद समय ओएस कुछ और पर हावी है, लेकिन मुझे यकीन है कि IO या रेखांकन की पीढ़ी नहीं है। वैसे भी स्रोत कोड उपलब्ध है और मुझे बहुत खुशी होगी अगर किसी को कोई त्रुटि मिलती है और वह सही है।
गिलहर्मे टोरेस कास्त्रो

वे परीक्षण पूरी तरह से कुछ अलग मापने के लिए लग रहे हैं। क्या आप परीक्षण पर टिप्पणी कर सकते हैं? याद रखें कि एक पूर्ण ग्राफ़ पर सबसे छोटी पथ समस्या O (1) है यदि दूरी ज्यामितीय / यूक्लिडियन हैं।
गैमिनिक

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.