我试图在无向加权图中找到2个顶点之间的最短路径。还已知权重是小于log(log | V |)的整数,其中| V |是顶点的数量。使用Bellman-Ford或Dijkstra算法很容易解决,但有没有哪种算法可以更快地完成?
到目前为止,我一直在考虑使用BFS并将重量大于1的边缘分成重量为1的几个,但是如果| V |则不是很好。数量很大。不,这不是我的功课,我只是想知道。
答案 0 :(得分:2)
考虑这个问题的一种方法是,使用Dijkstra算法查找无向加权图中两个顶点之间的最短路径,可以缩短运行时间。因此,在这种情况下,您可以使用二进制堆作为数据结构。堆是一个完整的二叉树,具有heap属性,在最小堆(最大堆)中,每个父节点都比树中的子节点小(更大)。在这里,您可以使用最小堆将成本从起始节点存储到每个节点。
有关堆的更多信息,请参见: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倍)。
希望获得帮助。