The Meningkatkan C ++ perpustakaan mencakup implementasi tumpukan Fibonacci di boost/pending/fibonacci_heap.hpp
. File ini tampaknya sudah pending/
bertahun-tahun dan dengan proyeksi saya tidak akan pernah diterima. Juga, ada bug dalam implementasi itu, yang diperbaiki oleh kenalan saya dan cowok keren yang serba bisa, Aaron Windsor. Sayangnya, sebagian besar versi file itu yang dapat saya temukan online (dan yang ada di paket libboost-dev Ubuntu) masih memiliki bug; Saya harus menarik versi bersih dari repositori Subversion.
Sejak versi 1.49 Boost C ++ libraries menambahkan banyak heaps struct baru termasuk fibonacci heap.
Saya dapat mengkompilasi dijkstra_heap_performance.cpp terhadap versi modifikasi dari dijkstra_shortest_paths.hpp untuk membandingkan tumpukan Fibonacci dan tumpukan biner. (Sejalan typedef relaxed_heap<Vertex, IndirectCmp, IndexMap> MutableQueue
, ubah relaxed
menjadi fibonacci
.) Saya pertama kali lupa mengkompilasi dengan optimisasi, dalam hal ini Fibonacci dan tumpukan biner berkinerja sama, dengan tumpukan Fibonacci biasanya mengungguli dengan jumlah yang tidak signifikan. Setelah saya kompilasi dengan optimasi yang sangat kuat, tumpukan biner mendapat dorongan besar. Dalam pengujian saya, Fibonacci tumpukan hanya mengungguli tumpukan biner ketika grafik sangat besar dan padat, misalnya:
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.
Sejauh yang saya mengerti, ini menyentuh perbedaan mendasar antara tumpukan Fibonacci dan tumpukan biner. Satu-satunya perbedaan teoretis nyata antara kedua struktur data adalah bahwa tumpukan Fibonacci mendukung penurunan kunci dalam waktu konstan (diamortisasi). Di sisi lain, tumpukan biner mendapatkan banyak kinerja dari implementasi mereka sebagai sebuah array; menggunakan struktur penunjuk eksplisit berarti tumpukan Fibonacci mengalami pukulan kinerja yang sangat besar.
Oleh karena itu, untuk mendapatkan manfaat dari tumpukan Fibonacci dalam praktiknya , Anda harus menggunakannya dalam aplikasi di mana penurunan_kunci sangat sering terjadi. Dalam hal Dijkstra, ini berarti bahwa grafik yang mendasarinya padat. Beberapa aplikasi bisa secara intrinsik mengurangi_kunci; Saya ingin mencoba algoritma pemotongan minimum Nagomochi-Ibaraki karena ternyata ia menghasilkan banyak penurunan_kunci, tetapi terlalu banyak upaya untuk membuat perbandingan waktu berfungsi.
Peringatan : Saya mungkin telah melakukan kesalahan. Anda mungkin ingin mencoba mereproduksi hasil ini sendiri.
Catatan Teoritis : Peningkatan kinerja tumpukan Fibonacci di penurunan_key penting untuk aplikasi teoretis, seperti runtutan Dijkstra. Fibonacci tumpukan juga mengungguli tumpukan biner pada penyisipan dan penggabungan (keduanya diamortisasi waktu-konstan untuk tumpukan Fibonacci). Penyisipan pada dasarnya tidak relevan, karena tidak memengaruhi runtuhnya Dijkstra, dan cukup mudah untuk memodifikasi tumpukan biner dan juga memasukkan waktu diamortisasi yang disisipkan. Menggabungkan dalam waktu yang konstan itu fantastis, tetapi tidak relevan dengan aplikasi ini.
Catatan pribadi : Seorang teman saya dan saya pernah menulis makalah yang menjelaskan antrian prioritas baru, yang mencoba mereplikasi waktu berjalan (secara teoritis) tumpukan Fibonacci tanpa kerumitan mereka. Makalah ini tidak pernah diterbitkan, tetapi rekan penulis saya mengimplementasikan tumpukan biner, tumpukan Fibonacci, dan antrian prioritas kami sendiri untuk membandingkan struktur data. Grafik dari hasil percobaan menunjukkan bahwa Fibonacci menumpuk sedikit melebihi kinerja biner dalam hal perbandingan total, menunjukkan bahwa tumpukan Fibonacci akan berkinerja lebih baik dalam situasi di mana biaya perbandingan melebihi overhead. Sayangnya, saya tidak memiliki kode yang tersedia, dan mungkin dalam perbandingan situasi Anda murah, jadi komentar ini relevan tetapi tidak secara langsung berlaku.
Secara kebetulan, saya sangat merekomendasikan untuk mencoba mencocokkan runtime dari tumpukan Fibonacci dengan struktur data Anda sendiri. Saya menemukan bahwa saya hanya menemukan kembali Fibonacci menumpuk sendiri. Sebelum saya berpikir bahwa semua kerumitan tumpukan Fibonacci adalah beberapa ide acak, tetapi setelah itu saya menyadari bahwa semuanya adalah alami dan cukup dipaksakan.