Boost c ++ ห้องสมุดรวมถึงการดำเนินการของกอง Fibonacci boost/pending/fibonacci_heap.hpp
ใน ไฟล์นี้มีมาpending/
นานหลายปีแล้วและจากการคาดการณ์ของฉันจะไม่ได้รับการยอมรับ นอกจากนี้ยังมีข้อผิดพลาดในการใช้งานซึ่งได้รับการแก้ไขโดยคนรู้จักของฉันและคนที่แต่งตัวประหลาดสุดยอด Aaron Aaron Windsor น่าเสียดายที่ไฟล์ส่วนใหญ่เวอร์ชันที่ฉันหาได้ทางออนไลน์ (และไฟล์หนึ่งในแพ็คเกจ libboost-dev ของ Ubuntu) ยังคงมีข้อบกพร่องอยู่ ฉันต้องดึงเวอร์ชั่นใหม่ทั้งหมดออกจากที่เก็บ Subversion
ตั้งแต่เวอร์ชั่น1.49 Boost C ++ไลบรารี่เพิ่ม heaps structs ใหม่ ๆ มากมายรวมถึง fibonacci heap
ผมสามารถที่จะรวบรวมdijkstra_heap_performance.cppกับรุ่นที่ปรับเปลี่ยนdijkstra_shortest_paths.hppเพื่อเปรียบเทียบกอง Fibonacci และกองไบนารี (ในบรรทัด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.
เท่าที่ฉันเข้าใจสิ่งนี้สัมผัสกับความแตกต่างพื้นฐานระหว่างฟีโบนักชีฮีปและฮีปไบนารี ความแตกต่างทางทฤษฎีที่แท้จริงเพียงอย่างเดียวระหว่างโครงสร้างข้อมูลทั้งสองคือฟีโบนักชีฮีปรองรับการลดลงของเวลาคงที่ (ตัดจำหน่าย) ในทางกลับกัน heap แบบไบนารีจะได้รับประสิทธิภาพอย่างมากจากการนำไปใช้เป็นอาเรย์ การใช้โครงสร้างตัวชี้ที่ชัดเจนหมายความว่าฮีพฟีโบนักชีประสบความสำเร็จอย่างมาก
ดังนั้นเพื่อให้ได้ประโยชน์จากฟีโบนักชีในทางปฏิบัติคุณต้องใช้มันในแอปพลิเคชันที่มีค่าลดลงเป็นจำนวนบ่อยครั้งอย่างไม่น่าเชื่อ ในแง่ของ Dijkstra หมายความว่ากราฟที่มีความหนาแน่นสูง แอปพลิเคชั่นบางตัวอาจมีความรุนแรงน้อยลงมาก ฉันต้องการลองอัลกอริธึมตัดขั้นต่ำของ Nagomochi-Ibarakiเพราะเห็นได้ชัดว่ามันสร้างจำนวนลดลงจำนวนมาก
คำเตือน : ฉันอาจทำสิ่งผิดปกติ คุณอาจต้องการลองทำซ้ำผลลัพธ์เหล่านี้ด้วยตัวเอง
บันทึกเชิงทฤษฎี : ประสิทธิภาพที่เพิ่มขึ้นของฟีโบนักชีฮีปบน reduction_key เป็นสิ่งสำคัญสำหรับการใช้งานเชิงทฤษฎีเช่นไทม์ของ Dijkstra ฮีปฟีโบนักชีนั้นมีประสิทธิภาพเหนือกว่าฮีปไบนารีในการแทรกและการรวม (ทั้งค่าคงที่เวลาคงที่สำหรับฟิโบนัชชีฮีป) การแทรกนั้นไม่สำคัญเพราะมันไม่ส่งผลกระทบต่อการทำงานของ Dijkstra และมันค่อนข้างง่ายที่จะแก้ไข heap แบบไบนารีเพื่อให้มีการแทรกในเวลาคงที่ที่ตัดจำหน่าย การผสานในเวลาคงที่นั้นยอดเยี่ยม แต่ไม่เกี่ยวข้องกับแอปพลิเคชันนี้
บันทึกส่วนตัว : เพื่อนของฉันและฉันเคยเขียนบทความอธิบายลำดับความสำคัญใหม่ซึ่งพยายามทำซ้ำ (ในทางทฤษฎี) เวลาทำงานของฟีโบนักชีกองโดยไม่ซับซ้อน กระดาษไม่เคยถูกตีพิมพ์ แต่ผู้เขียนร่วมของฉันใช้ไบนารีฮีปฟีโบนัชชีฮีปและคิวลำดับความสำคัญของเราเองเพื่อเปรียบเทียบโครงสร้างข้อมูล กราฟของผลการทดลองแสดงให้เห็นว่าฟีโบนัชชีกองฮีปไบนารีที่ทำออกมาเล็กน้อยในแง่ของการเปรียบเทียบทั้งหมดชี้ให้เห็นว่าฮีปฟีโบนักชีจะทำงานได้ดีขึ้นในสถานการณ์ที่ต้นทุนการเปรียบเทียบสูงกว่าค่าโสหุ้ย น่าเสียดายที่ฉันไม่ได้มีรหัสและน่าจะเป็นในการเปรียบเทียบสถานการณ์ของคุณราคาถูกดังนั้นความคิดเห็นเหล่านี้มีความเกี่ยวข้อง แต่ไม่เกี่ยวข้องโดยตรง
อนึ่งฉันขอแนะนำให้พยายามจับคู่รันไทม์ของฟีโบนักชีกองกับโครงสร้างข้อมูลของคุณเอง ฉันพบว่าฉันเพียงแค่คิดค้นฟีโบนักชีอีกครั้งให้เป็นกอง ก่อนที่ฉันจะคิดว่าความซับซ้อนทั้งหมดของกองฟีโบนักชีเป็นความคิดแบบสุ่ม แต่ต่อมาฉันก็รู้ว่าพวกเขาเป็นธรรมชาติและถูกบังคับอย่างเป็นธรรม