我最近在学习图算法,在我的大学里,我们被教导说,贝尔曼-福特的结果是从所有节点到所有其他节点的距离表(全对最短路径)。但是我不明白算法是如何实现的,并试图通过观看YouTube视频和在维基百科中查找定义等来理解它......
现在问题来了:
我找不到描述算法的资源,其结果将是所有对最短路径表,而只是"从一个节点到所有其他节点"。
是否可以调整贝尔曼-福特算法以实现所有对最短路径表,或者我的大学讲师对此完全错误?(他确实解释了一些提供所有对最短路径的算法,他称之为贝尔曼-福特,但我认为这不可能是贝尔曼福特)
编辑:我完全理解贝尔曼 - 福特算法的问题"从一个节点到所有其他节点的最短路径"。
我也理解我大学教授的"所有对最短路径"的大部分算法。
我只是很困惑,因为我大学的算法也被称为"贝尔曼-福特"。
如果你说德语:这里有一个视频,大学讲师谈论他的"贝尔曼-福特"(我认为实际上不是贝尔曼-福特):
https://www.youtube.com/watch?v=3_zqU5GWo4w&t=715s
Bellman Ford 是用于查找从给定开始节点到图中任何其他节点的最短路径的算法。
使用贝尔曼福特,如果我们从每个节点运行贝尔曼福特算法,然后获得所有其他节点的最短路径,我们可以生成所有对最短路径,但该算法最差的情况时间复杂度将是 O(V * V * E),如果我们有完整的图,这个复杂度将是O (V^4), 其中V是图中顶点(节点)的数量,E是图形中的边数。
有更好的算法来查找所有对最短路径,该算法在O(V^3)时间复杂度下工作。这就是弗洛伊德·沃歇尔算法。
在这里你可以阅读更多关于它的信息:https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
该算法的目的是找到从起点到终点的最短路径。
为此,它会找到从所有点到每个其他点的最短距离,然后选择通向解决方案的路径,并加起来最短。
首先,它从起点(A)开始。将每个点的成本设置为无穷大。
现在它看到了来自 A 的所有可能方向。A 的初始成本设置为零。
想象一下,它只需要前往B。一条可能有一条直线路径将 B 连接到 A,其成本为 10。
但也有一条通过 C 的路径。从 A 到 C 需要 5 成本,从 C 到 B 只需要 2 成本。这意味着从 A 到 B 有两种可能的路径。一个花费了 10,另一个花费了 5+2,即 7 .因此,它将到达 B 的成本从 A 更新为 7 而不是 10,因此应选择路径。
你可以想象同样的情况,但还有更多点。它应从起点搜索到到达终点,遍历所有可能的路径,并在需要时更新/不更新成本。最后,它将查找所有路径并选择成本最小的路径。
现在问题来了:我找不到资源 以结果将是 all 的方式描述算法 对最短路径表,但仅限于"从一个节点到所有其他节点" 节点"。
要理解这一点,想象一下我们必须达到A到D。
下面列出了从一个点移动到另一个点的单独成本
-
A 到 B :15
-
A 到 C :10
-
B 至 C :3
-
B 到 D :5
-
C 到 D :15
最初将所有点设置为无穷大,但 A 设置为零。
第一
A->B :成本 = 15(将 B 的成本更新为 15)
A->C:成本=10(将C的成本更新为10)
B->C :成本=18(B 的成本加上 B->C 本身的成本,所以不要更新为 C 的成本,因为已经小于此成本)
C->B :成本 = 13(C 的成本加上 C->B 单独成本,将 B 的成本更新为 13,因为这小于 15)
B->D :成本=18(B 的新成本加上 B->D 成本,将 D 的成本更新为小于无穷大)
C->D :成本=25(C的成本加上C->D成本,不要更新D)
因此,算法选择的路径是导致 D 的路径,成本为 18,这是最小的成本!
B
/ |
A | D
| /
C
A->C->B->D 费用:18
现在您可以阅读此链接以更好地理解。事情应该很清楚。
我在大学论坛上问过,得到了以下答案:
贝尔曼-福特最初是"从一个节点"。然而,当将原始贝尔曼-福特算法应用于图的每个节点时,不变性(算法引擎盖下的想法)不会改变。
原始Bellman-Ford的复杂度为O(V^3),如果从每个节点开始,它将是O(V^4)。但是,可以使用一个技巧,因为算法期间的发现类似于输入矩阵(包含直接路径长度)与自身的矩阵乘法。因为这是一个数学环,所以可以作弊并简单地计算矩阵^2,矩阵^4,矩阵^8等(这是我不完全理解的部分),并且可以实现O(V^3 * log V)。
他称这种算法为贝尔曼-福特,因为算法背后的不变/想法仍然是一样的。
在我们的公立大学论坛上回答德语