给定一个只有正边权重的有向连通图,是否有比使用Fibonacci堆的Dijkstra算法更快地找到两个顶点之间的最短路径的算法?
维基百科说,Dijkstra算法的时间复杂度是O(|E| + |V| * log(|V|))(使用Fibonacci堆)。
我不是在寻找像将执行时间减半这样的优化,而是寻找时间复杂度不同的算法(例如从O(n*log n)到O(n))。
此外,我想了解以下方法的您的看法:
1. 确定所有边权的最大公因数。 2. 将图转换为具有统一边权的图。 3. 使用BFS找到两个给定顶点之间的最短路径。
例如,假设最大公因数为1。那么我会将边A--->B(边权为3)转换为A->A'->A''->B(3倍的边权为1)。这个转换需要恒定的时间,并且必须对每个边都进行一次。所以我希望该算法的时间复杂度为O(|E|)(转换)+ O(|E| + |V|)(BFS)= O(2 * |E| + |V|) = O(|E| + |V|)。
感谢您抽出时间阅读我的问题,希望没有浪费您的时间^^。祝您有愉快的一天。
维基百科说,Dijkstra算法的时间复杂度是O(|E| + |V| * log(|V|))(使用Fibonacci堆)。
我不是在寻找像将执行时间减半这样的优化,而是寻找时间复杂度不同的算法(例如从O(n*log n)到O(n))。
此外,我想了解以下方法的您的看法:
1. 确定所有边权的最大公因数。 2. 将图转换为具有统一边权的图。 3. 使用BFS找到两个给定顶点之间的最短路径。
例如,假设最大公因数为1。那么我会将边A--->B(边权为3)转换为A->A'->A''->B(3倍的边权为1)。这个转换需要恒定的时间,并且必须对每个边都进行一次。所以我希望该算法的时间复杂度为O(|E|)(转换)+ O(|E| + |V|)(BFS)= O(2 * |E| + |V|) = O(|E| + |V|)。
感谢您抽出时间阅读我的问题,希望没有浪费您的时间^^。祝您有愉快的一天。