美文网首页程序员技术栈
算法: Johnson 算法

算法: Johnson 算法

作者: 写代码的海怪 | 来源:发表于2019-02-18 01:59 被阅读32次

Johnson 算法是用来解决在有负权重边图里的最短路径问题的,它主要了结合 Dijkstra 算法和 Bellman-Ford 算法。其实负数边的问题也可以用 Folyd 算法来解决,只不过它的算法复杂度是 O(n^3),而 Johnson 算法在稀疏图里复杂度是 O(n^2\log(n)) ,会比 Folyd 好一点。

Reweight

我们考虑如下图结构

其中 0 -> 1 是负数的,是不能使用 Dijkstra 去求最短路径的。这时我们可能会想到把全部的边都加上 5 那大家不就都变成正数了?使用 Dijkstra 求完最短路径后再减回 5 那答案不就求到了么?这是一种思路,但是不完成正确,考虑如下图

这个图的 S 到 T 最短路径是 3(选上面那条路) ,但是所有边都加 1 后,最短路径就变成了 4 (选了下面那条路)。

而 Johnson 的方法是通过给每个节点设置一个值,用这些节点的值去做 reweight,公式如下:

w[u, v] = w[u, v] +h[u] - h[v]

h[x] 就是节点 X 的值,这个值是通过 Bellman-Ford 求出来的。

h[x]

现在来说说怎么求这个 h[x]。其实很简单,在这个图中添加一个虚拟的节点,如下图所示,为什么说是虚拟的呢,因为用完就删除了。这个虚拟节点指向所有的节点,而指向所有节点的边权重为 0。

h[x] 就是用 Bellman-ford 去求这个虚拟节点到每个节点的最短距离。以上图为例,每个节点的 h 值为:

节点 h[x]
0 0
1 -5
2 0
3 0

有了这些 h[x] 值后就可以对每条边进行 reweight 操作了,最终的路径应该要减去开始节点的 h 值,再加上结束节点的 h 值。以 0 -> 1 -> 2 为例,Dijkstra 算法求出的路径是

d[0, 2] = (w[0, 1] + h[0] - h[1]) + (w[1, 2] + h[1] - h[2]) = w[0, 1] + w[1, 2] + h[0] - h[2] = -1

然后再还原到真实的路径

d[0, 2] = d[0, 2] - h[0] + h[2] = -1

以上面的图为例

Johnson 算法步骤

上面都是 Johnson 的关键步骤,下面就说说整个 Johnson 算法的流程。

  1. 添加虚拟节点到这个图里,并添加指向所有节点的虚拟边,这些边的权重为 0
  2. 以虚拟节点节点为起点,运行 Bellman-Ford 算法,求出到每个节点的最短距离,这些最短距离为每个节点的 h[节点]
  3. 用上面求出的 h 值去更新图里的边,使得 edge[u, v] = edge[u, v] + h[u] - h[v]
  4. 移除添加的虚拟节点和边
  5. 在每个节点运行 Dijkstra 计算到其它节点的最短距离

再来分析这个算法的时间复杂度,Bellman-Ford 算法时间复杂度是 O(mn),Dijkstra 算法的时间复杂度是 O(n\log(n)),因为每个节点都要做 Dijkstra,所以总的时间复杂度是 O(n^2\log(n) + mn)

相关文章

  • 算法: Johnson 算法

    Johnson 算法是用来解决在有负权重边图里的最短路径问题的,它主要了结合 Dijkstra 算法和 Bellm...

  • 2018-12-26 Johnson 算法和传输层复习

    在算法设计与分析动态规划 流水线调度设计中,Johnson算法的基本思路是列出双机问题的相关时间矩阵,按照最...

  • Johnson 全源最短路径算法

    前言 上一篇文章已经阐述了Floyd-Warshall算法,适用于存在负权重路径的稠密图。本文讲述的算法适用于稀疏...

  • 匈牙利算法

    算法思想 算法流程 算法步骤 算法实现 python 算法应用

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 机器学习算法

    机器学习的算法分监督算法和无监督 算法。监督算法包括回归算法,神经网络,SVM;无监督算法包括聚类算法,降维算法。...

  • 字符串匹配

    BF 算法和 RK 算法BM 算法和 KMP 算法

  • 垃圾回收算法有几种类型? 他们对应的优缺点又是什么?

    常见的垃圾回收算法有: 标记-清除算法、复制算法、标记-整理算法、分代收集算法 标记-清除算法 标记—清除算法包括...

  • 头条-手撕代码

    [toc] 图算法 以及最短路径算法 树算法 手写LRU 排序算法 链表算法

  • 关于一些算法

    我们平常说的算法按照使用方向加密算法,排序算法,搜索算法,优化算法,音视频处理算法,图片处理算法 1.加密解密算法...

网友评论

    本文标题:算法: Johnson 算法

    本文链接:https://www.haomeiwen.com/subject/girasqtx.html