我知道Dijkstra的算法實際上是用斐波那契堆實現的。但是它是否也可以使用紅黑樹實現,並且仍然具有O(m log n)的最壞情況運行時間?使用紅/黑樹實現Dijkstra的最短路徑算法?
2
A
回答
7
對於初學者來說,實際上看到Dijkstra算法用斐波那契堆實現是很少見的。儘管斐波納契堆給出了很好的漸近性(O(m + n log n)),但實際上它具有如此高的常數因子,以致其他類型的堆更有效。
至於你的問題 - 是的,你可以使用紅黑樹作爲優先級隊列來獲得O(m log n)性能。這是有效的,因爲您可以在O(log n)時間的紅黑樹中找到最小元素,並在時間O(log n)上模擬樹上的減鍵操作,方法是先執行刪除,然後插入。但是,這可能不如使用標準二進制堆的效率高,因爲紅黑樹具有更差的參考位置和更多的內存開銷。更一般地說,每當你需要一個優先級隊列時,你總是可以使用一個平衡的二叉搜索樹,儘管通常這樣做是矯枉過正的。
希望這會有所幫助!
2
我不會說Dijkstra的算法是用斐波那契堆實現的。事實上,任何堆都可以完成,儘管斐波那契在不同的操作中具有最好的分期複雜性(請記住,儘管這隻顯示在真的是巨大的圖表)。再次使用紅黑樹會達到相同的計算複雜度,但會有更高的常量,因爲使用紅黑樹更復雜。
該算法所需的只是能夠從給定集合中獲得最小元素。這就是堆的意思,因此它最適合這個問題。紅黑樹可以做很多其他的事情,因此更復雜,並在這種特殊情況下變得更糟糕。
相關問題
- 1. 使用Dijkstra算法的最短路徑
- 2. AFP Dijkstra的最短路徑算法
- 3. dijkstra的最短路徑算法回溯?
- 4. Dijkstra找到最短路徑的算法?
- 5. Dijkstra的最短路徑算法修改
- 6. Dijkstra的算法最短路徑
- 7. Dijkstra的最短路徑算法問題
- 8. 做一個C++ 11 Dijkstra算法實現返回最短路徑
- 9. sna:修改Dijkstra算法(最短路徑)
- 10. Dijkstra算法尋找最短路徑
- 11. 增量Dijkstra或最短路徑算法?
- 12. 實現方法找到最短路徑(Dijkstra算法)的被陷在環路
- 13. 使用Dijkstra算法的2d數組中的最短路徑?
- 14. Dijkstra的最短路徑,HackerRank
- 15. 使用Dijkstra的多條最短路徑
- 16. 使用Dijkstra算法尋找最短路徑
- 17. 最短路徑Dijkstra Java
- 18. Neo4j 2.2.5 - Dijkstra最短路徑
- 19. 如何限制最短路徑 - dijkstra算法的最大代價?
- 20. Dijkstra算法計算N條最短路徑
- 21. 如何返回n最佳最短路徑(dijkstra算法)
- 22. 紅黑樹實現
- 23. Dijkstra的最短路徑算法是行不通的
- 24. Dijkstra的算法 - 只有負成本的DAG最短路徑
- 25. Dijkstra的算法不會生成最短路徑?
- 26. Dijkstra std :: priority_queue的最短路徑算法性能vs std :: set
- 27. Dijkstra的最短路徑算法拉爾斯·沃格爾
- 28. 的Dijkstra最短路徑算法無限循環
- 29. 的最短路徑指數來,我被要求找出一種圖形,其總的最短路徑(使用Dijkstra算法)數量的節點(Dijkstra算法)
- 30. Dijkstra最短路徑與最小步驟
請參閱http://www.cs.utexas.edu/users/shaikat/papers/TR-07-54.pdf瞭解如何有效實施它的實際方法。 – mmgp
看看這個相關的問題http://stackoverflow.com/q/14252582/194609 – Karussell