我正试图实现一个加权图。我知道有两种方法来实现加权图。可以使用二维数组(邻接矩阵),也可以使用链表(邻接列表)。哪一个更高效,更快?图库实现
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. 实现加权图
非常好的答案。非常感谢你。 –