我正在尝试实施加权图。我知道有两种方法可以实现加权图。使用二维数组(邻接矩阵)或链接列表数组(邻接列表)。哪两个更高效,更快?
答案 0 :(得分:2)
两者中的哪一个更有效,更快?
这取决于您的使用情况以及您要存储的图表种类。
令n为节点数,m为边数。如果你想知道两个节点u和v是否连接(以及边缘的权重),邻接矩阵允许你在恒定时间内(O-notation,O(1))确定这个,只需检索条目A[u,v]
。使用邻接列表,您将需要查看您列表中的每个条目或v列表 - 在最坏的情况下,可能有n个条目。因此,邻接列表的边缘查找在O(n)中。
邻接矩阵的主要缺点是需要的内存。总而言之,您需要存储n ^ 2个条目。使用邻接列表,您只需要存储实际存在的边(m个条目,假定有向图)。因此,如果您的图表稀疏,则邻接列表显然会占用更少的内存。
我的结论是:如果主要操作是检索两个特定节点的边权重,则使用邻接矩阵;在图表足够小以使n ^ 2个条目适合内存的条件下。否则,请使用邻接列表。
答案 1 :(得分:1)
就个人而言,我会选择链表方法,假设它通常是一个稀疏图形(即大多数阵列单元都是浪费空间)。
去维基百科阅读adjacency lists(自从我使用图表以来已经过了很长时间),它有两个关于两种方法之间权衡的好处。最终,与许多任何一种选择一样,它将取决于“它取决于”,基于您的图书馆可能的用例。
在阅读维基文章之后,我认为另一个支持使用列表的点是将数据附加到每个有向段(或者甚至是不同的权重,考虑2点之间的步行/自行车/汽车距离等)。