Boost C ++ kütüphaneleri içinde Fibonacci yığınları bir uygulamasını içerir boost/pending/fibonacci_heap.hpp
. Görünüşe göre bu dosya pending/
yıllardır var ve benim tahminlerim tarafından asla kabul edilmeyecek. Ayrıca, bu uygulamada tanıdıklarım ve çok yönlü havalı adam Aaron Windsor tarafından düzeltilen hatalar oldu. Ne yazık ki, bu dosyanın çevrimiçi olarak bulabildiğim sürümlerinin çoğu (ve Ubuntu'nun libboost-dev paketindeki) sürümlerinde hala hatalar vardı; Subversion deposundan temiz bir sürüm çekmek zorunda kaldım .
Sürüm 1.49 Boost C ++ kütüphaneleri beri fibonacci yığın dahil olmak üzere birçok yeni yığın yapı ekledi.
Fibonacci yığınlarını ve ikili yığınları karşılaştırmak için dijkstra_shortest_paths.hpp'nin değiştirilmiş bir versiyonuna karşı dijkstra_heap_performance.cpp'yi derleyebildim . (Çizgidetypedef relaxed_heap<Vertex, IndirectCmp, IndexMap> MutableQueue
, değiştirme relaxed
için fibonacci
.) İlk ve bu durumda Fibonacci ve ikili yığınları Fibonacci yığınları, genellikle önemsiz bir miktarı ile daha iyi performans ile, yaklaşık olarak aynı yerine, en iyi duruma derleme unuttum. Çok güçlü optimizasyonlarla derlendikten sonra, ikili yığınlar muazzam bir artış gösterdi. Testlerimde, Fibonacci yığınları, grafik inanılmaz derecede büyük ve yoğun olduğunda, örneğin:
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.
Anladığım kadarıyla, bu Fibonacci yığınları ve ikili yığınlar arasındaki temel farklılıklara değiyor. İki veri yapısı arasındaki tek gerçek teorik fark, Fibonacci yığınlarının (amortismanlı) sabit sürede azaltma tuşunu desteklemesidir. Öte yandan, ikili yığınlar bir dizi olarak uygulamalarından büyük bir performans elde eder; açık bir işaretçi yapısı kullanmak, Fibonacci yığınlarının büyük bir performans isabeti çektiği anlamına gelir.
Bu nedenle, pratikte Fibonacci yığınlarından faydalanmak için , onları azalma_anahtarlarının inanılmaz sık olduğu bir uygulamada kullanmanız gerekir. Dijkstra açısından, alttaki grafiğin yoğun olduğu anlamına gelir. Bazı uygulamalar içsel olarak reduce_key-intense olabilir; Denemek istedimNagomochi-Ibaraki minimum kesim algoritmasını çünkü görünüşe göre bir sürü reduce_key üretiyor, ama bir zamanlama karşılaştırması çalışmak için çok fazla çaba oldu.
Uyarı : Yanlış bir şey yapmış olabilirim. Bu sonuçları kendiniz oluşturmayı deneyebilirsiniz.
Teorik not : Fibonacci yığınlarının reduce_key üzerindeki gelişmiş performansı, Dijkstra'nın çalışma süresi gibi teorik uygulamalar için önemlidir. Fibonacci yığınları ayrıca yerleştirme ve birleştirme üzerindeki ikili yığınlardan daha iyi performans gösterir (her ikisi de Fibonacci yığınları için itfa edilmiş sabit zamanlı). Ekleme esasen önemsizdir, çünkü Dijkstra'nın çalışma zamanını etkilemez ve ikili yığınları itfa edilmiş sabit zamanda da eklemek için değiştirmek oldukça kolaydır. Sabit zamanda birleştirme harika, ancak bu uygulama ile ilgili değil.
Kişisel not : Bir arkadaşım ve ben bir zamanlar, Fibonacci yığınlarının karmaşıklık olmadan (teorik) çalışma süresini çoğaltmaya çalışan yeni bir öncelik sırasını açıklayan bir makale yazdık. Makale asla yayınlanmadı, ancak yazarım ikili yapıları, Fibonacci yığınlarını ve veri yapılarını karşılaştırmak için kendi öncelik kuyruğumuzu uyguladı. Deney sonuçlarının grafikleri, Fibonacci'nin toplam karşılaştırmalar açısından hafifçe gerçekleştirilen ikili yığınları yığınladığını göstermektedir, bu da Fibonacci yığınlarının karşılaştırma maliyetinin ek yükü aştığı bir durumda daha iyi performans göstereceğini göstermektedir. Ne yazık ki, mevcut kodum yok ve muhtemelen durum karşılaştırmanızda ucuz, bu yüzden bu yorumlar alakalı ama doğrudan uygulanabilir değil.
Bu arada, Fibonacci yığınlarının çalışma zamanını kendi veri yapınızla eşleştirmeye çalışmanızı şiddetle tavsiye ederim. Fibonacci yığınlarını kendim yeniden keşfettiğimi fark ettim. Fibonacci yığınlarının tüm karmaşıklıklarının bazı rastgele fikirler olduğunu düşünmeden önce, ancak hepsinin doğal ve oldukça zorlandığını fark ettim.