Data structures 哪些图算法更喜欢邻接矩阵?为什么?

Data structures 哪些图算法更喜欢邻接矩阵?为什么?,data-structures,graph,adjacency-matrix,adjacency-list,Data Structures,Graph,Adjacency Matrix,Adjacency List,我听说邻接列表在大多数图算法中都使用,但不是全部。我只是想知道什么算法更喜欢邻接矩阵,为什么 到目前为止,我发现Floyd Warshall使用邻接矩阵。邻接列表通常比邻接矩阵更快,在算法中,每个节点执行的关键操作是“迭代与该节点相邻的所有节点”。这可以在时间Odegv time内完成,其中degv是节点v的阶数,而在邻接矩阵中需要时间Θn。类似地,邻接列表可以快速遍历图中的所有边-与邻接矩阵的时间Θn2相比,这样做需要时间Om+n 一些最常用的图算法BFS、DFS、Dijkstra算法、A*搜

我听说邻接列表在大多数图算法中都使用,但不是全部。我只是想知道什么算法更喜欢邻接矩阵,为什么


到目前为止,我发现Floyd Warshall使用邻接矩阵。

邻接列表通常比邻接矩阵更快,在算法中,每个节点执行的关键操作是“迭代与该节点相邻的所有节点”。这可以在时间Odegv time内完成,其中degv是节点v的阶数,而在邻接矩阵中需要时间Θn。类似地,邻接列表可以快速遍历图中的所有边-与邻接矩阵的时间Θn2相比,这样做需要时间Om+n

一些最常用的图算法BFS、DFS、Dijkstra算法、A*搜索、Kruskal算法、Prim算法、Bellman-Ford算法、Karger算法等需要对所有边或与特定节点相关的边进行快速迭代,因此它们在邻接列表中工作得最好

你提到Floyd Warshall使用邻接矩阵。虽然Floyd Warshall确实维护了一个内部矩阵来跟踪到目前为止看到的最短路径,但它实际上并不要求原始图是一个邻接矩阵。动态规划工作的总成本是Θn3,这比将邻接列表转换为邻接矩阵或将邻接矩阵转换为邻接矩阵的On2成本要大

只有少数地方邻接矩阵比邻接列表快。邻接矩阵需要时间O1来测试图中是否存在特定的边,这比邻接列表上相应操作的Odegv开销要快。由于将邻接列表转换为邻接矩阵的成本为Θn2,因此,邻接矩阵优于邻接列表的唯一情况是在需要1个边的随机访问和2算法的总运行时间为2的情况下。我只知道一些算法可以做到这一点。例如,有一个示例,在该示例中,会给您一个图形,并要求您查找是否存在一个节点,该节点的传入边来自每个节点,而传出边不来自任何节点。这可以通过使用邻接矩阵及时完成,比使用邻接列表更快

也就是说,您也可以使用邻接列表来表示,而不是使用常规列表来表示,并与上面相同的运行时边界相匹配,尽管现在创建邻接列表的成本只是预期的快速,而不是实际的最坏情况效率

我发现邻接矩阵有用的主要原因是从不同的角度思考图形。例如,将邻接矩阵提高到第k次方可生成一个新矩阵,该矩阵使用精确的k跳数计算从一个节点到另一个节点的路径数。例如,这可以用于。类似地,计算图的传递闭包的方法是将图表示为矩阵,并使用一些巧妙的技术将位块视为整数,然后在查找表中使用,以优于原始搜索


希望这有帮助

在每个节点执行的关键操作是“迭代与该节点相邻的所有节点”的算法中,邻接列表通常比邻接矩阵快。这可以在邻接列表的时间Odegv time中完成,其中degv是节点v的阶数,而在邻接矩阵中需要时间Θn。类似地,邻接列表可以快速遍历图中的所有边-与邻接矩阵的时间Θn2相比,这样做需要时间Om+n

一些最常用的图算法BFS、DFS、Dijkstra算法、A*搜索、Kruskal算法、Prim算法、Bellman-Ford算法、Karger算法等需要对所有边或与特定节点相关的边进行快速迭代,因此它们在邻接列表中工作得最好

你提到Floyd Warshall使用邻接矩阵。虽然Floyd Warshall确实维护了一个内部矩阵来跟踪到目前为止看到的最短路径,但它实际上并不要求原始图是一个邻接矩阵。动态规划工作的总成本是Θn3,这比将邻接列表转换为邻接矩阵或将邻接矩阵转换为邻接矩阵的On2成本要大

只有少数地方邻接矩阵比邻接列表快。邻接矩阵需要时间O1来测试图中是否存在特定的边,这比邻接列表上相应操作的Odegv开销要快。由于将邻接列表转换为邻接矩阵的成本为Θn2,因此,邻接矩阵优于邻接列表的唯一情况是在需要1个边的随机访问和2算法的总运行时间为2的情况下。我只知道一些算法可以做到这一点。例如,有 在这里,会给您一个图,并要求您查找是否存在一个节点,该节点的传入边来自每个节点,而传出边则没有节点。这可以通过使用邻接矩阵及时完成,比使用邻接列表更快

也就是说,您也可以使用邻接列表来表示,而不是使用常规列表来表示,并与上面相同的运行时边界相匹配,尽管现在创建邻接列表的成本只是预期的快速,而不是实际的最坏情况效率

我发现邻接矩阵有用的主要原因是从不同的角度思考图形。例如,将邻接矩阵提高到第k次方可生成一个新矩阵,该矩阵使用精确的k跳数计算从一个节点到另一个节点的路径数。例如,这可以用于。类似地,计算图的传递闭包的方法是将图表示为矩阵,并使用一些巧妙的技术将位块视为整数,然后在查找表中使用,以优于原始搜索


希望这有帮助

这是一个很好的答案!谢谢这是一个很好的回答!非常感谢。