贝尔曼-福特算法

编辑
本词条由“匿名用户” 建档。
贝尔曼-福特算法,是一种图论算法,用于计算从边加权图中的起始节点开始的最短路径。偶尔会提到摩尔-贝尔曼-福特算法。 与Dijkstra算法(在图中寻找最短路径的最著名方法)不同,此处边的权重也可以为负。但是,必须排除可以从起始节点到达的负权重循环,因为否则它们可以运行任意次数并且可以构建权重越来越低的路径,因此根本不存在权重最低的路径.贝尔曼-福特算法可以检测负权重循环的存在。 G表示具有节点集V...

贝尔曼-福特算法

编辑

贝尔曼-福特算法,是一种图论算法,用于计算从边加权图中的起始节点开始的最短路径。 偶尔会提到摩尔-贝尔曼-福特算法。

与 Dijkstra 算法(在图中寻找最短路径的最著名方法)不同,此处边的权重也可以为负。 但是,必须排除可以从起始节点到达的负权重循环,因为否则它们可以运行任意次数并且可以构建权重越来越低的路径,因此根本不存在权重最低的路径. 贝尔曼-福特算法可以检测负权重循环的存在。

描述

编辑

G 表示具有节点集 V  和边集 E 的加权图。 权重指定两个节点之间的边的权重。 s 是计算到所有其他节点的最短路径的起始节点,而 n 是 V 中的节点数。

当算法执行结束时,输出显示 G是否有负长度循环。 如果不是这种情况,则每个节点的距离包含它到 s的距离,即从 s 开始的最短路径的权重。 生成也是前人定义的,它以树内的形式存储从 s 开始的最短路径。 从一个节点开始,通过递归访问前人给出的节点,直到到达 s  ,可以向后确定相应的最短路径。

一条没有循环的路径最多包含 n 个节点,即 n − 1 条边。 因此,如果在第 10 行中确定路径不是最优路径,则它必须包含负权重的循环。

正确性证明

编辑

算法的正确性可以通过归纳来证明。

如果没有权重为负的环,则每条最短路径最多包含每个节点一次,因此第 09 行到第 11 行无法进一步改进。 相反,假设无法进行任何改进。 然后对于节点 v 0 , … , v k − 1 {\displaystyle v_{0},\ldots ,v_{k-1}} 的每个循环:

D i s t a n c e ( v i ) ≤ D i s t a nc e ( v ( i − 1 mod k ) ) + w e h t ( v ( i − 1 mod k ) , vi i )

在循环中求和,然后是项 D i s t a n c e ( v i )

也就是说,每个循环都有一个非负权重。

时间复杂度

编辑

贝尔曼-福特算法的运行时间为 O ,其中 n 是节点数,m 是图中的边数。

如果你想找到从每个节点到每个其他节点的最短路径,你必须为每个起始节点应用一次算法,即总共 n 次。 因此,运行时复杂度为 O。

与其他算法比较

编辑

比贝尔曼-福特算法更快的是 Dijkstra 算法,这是一种寻找最短路径的贪婪算法,它连续地将优先级队列中的下一个最佳节点包含在结果集 S 中。 它的运行时间为 O 。 然而,它的缺点是它只接受具有非负权重的图作为输入。

A* 算法通过估计函数扩展了 Dijkstra 算法,并具有运行时间 O ( n 2 )。

贝尔曼-福特算法

另一种寻找最短路径的方法是 Floyd-Warshall 算法,它基于像贝尔曼-福特算法这样的动态规划。 两者的正确性都基于贝尔曼的最优性原则。

应用

编辑

贝尔曼-福特算法用于距离矢量算法,一种动态路由算法等。 这将 z。 例如,路由信息协议使用它,该协议在管理网络域(内部网关协议)内动态创建路由表。

贝尔曼-福特算法的分布式变体用于距离矢量路由协议,例如路由信息协议。 该算法是分布式的,因为它涉及自治系统内的许多节点(路由器),自治系统是通常由 Internet 服务提供商拥有的 IP 网络的集合。

内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/331834/

(5)
词条目录
  1. 贝尔曼-福特算法
  2. 描述
  3. 正确性证明
  4. 时间复杂度
  5. 与其他算法比较
  6. 应用

轻触这里

关闭目录

目录
尊敬的全球百科用户,全球百科新系统上线了!新增排名保障卡、词条年卡,更有增值功能——百度排名保障包年服务,详情访问“glopedia.cn/261472/”关注公众号可联系人工客服。