我正試圖實現一個加權圖。我知道有兩種方法來實現加權圖。可以使用二維數組(鄰接矩陣),也可以使用鏈表(鄰接列表)。哪一個更高效,更快?圖庫實現
Q
圖庫實現
2
A
回答
2
兩者中哪一個更高效,更快?
這取決於您的使用情況以及要存儲的圖表種類。
設n是節點的數量,m是邊的數量。如果您想知道兩個節點u和v是否連接(以及邊的權重),則只需通過檢索條目A[u,v]
即可在相鄰矩陣的恆定時間內(在O-notation,O(1))確定此值。在鄰接列表中,您必須查看u列表中的每個條目,或v的列表 - 最壞的情況下,可能有n個條目。因此,鄰接列表的邊緣查找在O(n)中。
鄰接矩陣的主要缺點是需要的內存。總而言之,您需要存儲n^2個條目。使用鄰接列表時,只需要存儲實際存在的邊(m個條目,如有向圖)。所以如果你的圖很稀疏,鄰接列表顯然會佔用更少的內存。
我的結論是:如果您的主要操作是檢索兩個特定節點的邊權重,則使用鄰接矩陣;在圖表足夠小的條件下,以便n^2個條目適合內存。否則,請使用鄰接列表。
1
就我個人而言,我會去鏈接列表方法,假設它通常是一個稀疏圖(即大多數數組單元是浪費空間)。
去維基百科閱讀adjacency lists(自從我使用圖表以來已經過了很長時間),並且在兩種方法之間的權衡方面有一個很好的部分。最終,與許多/或選擇一樣,它將歸結爲「取決於」,這取決於圖書館可能的用例。
讀取wiki文章後,我認爲有利於使用列表的另一點是附加數據到每個向線段(或甚至不同的權重,2點之間等認爲步行/自行車/車距離的)
相關問題
- 1. Opengl圖庫實現?
- 2. 圖數據庫的實現
- 3. ShortcutBadger庫實現
- 4. 實現Clojure庫
- 5. Android Crouton庫實現自定義視圖
- 6. 使用縮放實現圖庫
- 7. 如何在CSS中實現圖庫
- 8. 用回形針實現圖像庫
- 9. 使用ListViews的垂直圖庫實現
- 10. OpenGL庫的實現
- 11. Swing JScrollPane庫實現
- 12. 庫實現問題
- 13. 存儲庫實現
- 14. chrono庫的實現
- 15. Android Studio - 實現庫
- 16. C庫實現RPC
- 17. 實現地圖
- 18. 如何實現圖片庫(本地圖像)
- 19. 在圖形庫中實現「繪圖模式」?
- 20. 如何實現類似於google圖片搜索的圖片庫
- 21. Java的圖形庫實現網絡可視化的圖形
- 22. Silverlight:實現圖像
- 23. 實現CoverFlow視圖
- 24. 試圖實現zipWith
- 25. 有向圖實現
- 26. 實現在圖像
- 27. 試圖實現RevMob
- 28. Java地圖實現
- 29. C++:實現圖形
- 30. 實現加權圖
非常好的答案。非常感謝你。 –