Dijkstra算法和Floyd算法详解

本文详细对比了Dijkstra算法与Floyd算法在求解最短路径问题上的区别。Dijkstra算法适用于求解单一源点到其他各顶点的最短路径,而Floyd算法则用于求解任意两个顶点间的最短路径。文章还介绍了两种算法的具体实现步骤及时间复杂度。

区别:Dijkstra算法是求单元最短路径的算法,,即是求某个顶点到其余各顶点的最短路径。而Floyd算法是求任意两个顶点之间的最短路径。

 

Dijkstra算法(迪杰斯特拉算法)

基于贪心策略

具体步骤:

  1. 声明一个数组来保存起始点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点集合S,剩余顶点的集合V。
  2. 初始时,S中只有起始点然后从剩余顶点中找到一个点使得从从起始点到该点的路径是最短路径,并且把该点加入到S中。
  3. 然后我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就修改这些顶点在数组中的值。 
    然后,重复上述动作,直到S中包含了图的所有顶点。

 

下图为v1到各终点dist值和最短路径的求解过程:

 

人们可能只希望找到从源点到某一个特定顶点的最短路径,但是,这个问题和求解源点到其他所有顶点的最短路径一样复杂, 其时间复杂度也为O(|V|^2)。而如果要找出所有结点对之间的最短距离,则需要对每个结点运行次Dijkstra 算法,即时间复杂度为O(|V|^3)。

 

Floyd算法

是一个经典的动态规划算法

算法步骤:

  1. 初始时,对于任意两个顶点,若他们之间存在边,则以此边上的权值作为它们之间的最短路径长度,若不存在有向边,则以∞作为它们之间的最短路径长度,
  2. 之后逐步尝试在原路径中加入顶点作为中间顶点,如果增加中间顶点后,得到的路径比原来的路径短,则以此新路径代替原路径。

 

 

Floyd算法的时间复杂度为O(|V|^3),也可以用单源最短路径算法来解决每对顶点之间最短路径问题。每一次运行时,轮流将一个顶点作为源点,并且若所有边权值均为非负时,可以采用上面提到的Dijkstra算法,其时间复杂度为O(|V|^2)*|V|=O(|V|^3)

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值