无向加权图中2个顶点之间的最短路径
shortest path between 2 vertices in undirected weighted graph
我试图在无向加权图中找到 2 个顶点之间的最短路径。众所周知,权重是小于 log(log|V|) 的整数,其中 |V|是顶点的数量。使用 Bellman-Ford 或 Dijkstra 算法很容易解决,但是有没有可以更快解决的算法?
到目前为止,我一直在考虑使用 BFS 并将权重大于 1 的边分成几个权重为 1 的边,但是如果 |V| 并不是一个好主意是大数。不,这不是我的作业,我只是想知道。
思考这道题的一种方法是提高运行使用Dijkstra算法寻找无向加权图中两个顶点之间的最短路径的时间。所以在这种情况下,您可以使用二叉堆作为数据结构。堆是一个完整的二叉树,堆 属性 中每个父节点都小于(大于)最小堆(最大堆)中树中的子节点。这里可以使用最小堆来存储从起始节点到每个节点的成本。
可以在此处找到有关堆的更多信息:https://courses.csail.mit.edu/6.006/fall10/handouts/recitation10-8.pdf
有了堆,Dijkstra 算法的 运行 时间可以从 O(V^2) 减少到 O(E log E),因为从堆中选择最小距离需要 O(log V )(删除最小距离是 O(1),修复堆需要 O(log V)),更新到顶点的距离总共需要 O(E log V)(修复堆需要 O(log V),需要 E 次检查邻居并更改成本)。
希望对您有所帮助。
我试图在无向加权图中找到 2 个顶点之间的最短路径。众所周知,权重是小于 log(log|V|) 的整数,其中 |V|是顶点的数量。使用 Bellman-Ford 或 Dijkstra 算法很容易解决,但是有没有可以更快解决的算法?
到目前为止,我一直在考虑使用 BFS 并将权重大于 1 的边分成几个权重为 1 的边,但是如果 |V| 并不是一个好主意是大数。不,这不是我的作业,我只是想知道。
思考这道题的一种方法是提高运行使用Dijkstra算法寻找无向加权图中两个顶点之间的最短路径的时间。所以在这种情况下,您可以使用二叉堆作为数据结构。堆是一个完整的二叉树,堆 属性 中每个父节点都小于(大于)最小堆(最大堆)中树中的子节点。这里可以使用最小堆来存储从起始节点到每个节点的成本。
可以在此处找到有关堆的更多信息:https://courses.csail.mit.edu/6.006/fall10/handouts/recitation10-8.pdf
有了堆,Dijkstra 算法的 运行 时间可以从 O(V^2) 减少到 O(E log E),因为从堆中选择最小距离需要 O(log V )(删除最小距离是 O(1),修复堆需要 O(log V)),更新到顶点的距离总共需要 O(E log V)(修复堆需要 O(log V),需要 E 次检查邻居并更改成本)。
希望对您有所帮助。