grokking algorithms--第七章-Dijkstra's algorithm迪杰斯特拉算法中文翻译

第七章 迪杰斯特拉(Dijkstra’s algorithm)算法
在本章中:
我们继续讨论图,你会学到有权重的图,每条边上有不同的权重值。
你将学到迪杰斯特拉算法,这个算法可以告诉我们在有权值的图中“到终点X的最近的路 时是哪一条?”
你会学到图中的闭环,这种情况下迪杰斯特拉算法是不起作用的。
这里写图片描述
在上一章中,我们找到了一条从A点到B点最短的路,但是,它却不一定是最快的路,它是 最短的路,因为它经过的路段最少,但是如果你将每段路需要花费的时间加上,那么你可以 找到更快一点的路。如下图黑色标出的部分。
这里写图片描述
上一章中用了广度优先搜索算法,该算法可以找到经过节点最少的路径。若果你想找到用时
最短的路径呢?你可以换一种不同的算法—迪杰斯特拉算法。
我们来看下它是怎么发挥超能力的?
这里写图片描述

该图中,到达每一个节点都需要一定的时间,你可以利用迪杰斯特拉算法(Dijkstra’s algorithm)来找到从起点到终点花费时间最短的路径。 如果你利用广度优先算法,你可以找到的最短路径是起点—>A—>终点。
这里写图片描述
但是这条路线需要7分钟,让我们来找一条花费时间更短的路径,这需要四步: 1.找到时间花费最少的节点。
2.更新这个节点的邻居节点的花费时间。 3.重复以上步骤,知道图中所有的节点都遍历过了。 4.计算最终路径所需的时间。
步骤1:找到花费时间最短的节点。 从起点开始,如果你要去A点或B点,那么它们分别需要耗费多少时间呢?
这里写图片描述

从起点到A节点需要6分钟,从起点到B点需要2分钟,剩下的节点需要多长时间,我们暂时 不知道。
这里写图片描述
因为我们不转掉到达终点需要花费多长时间, 我们用无穷大来标示。 现在节点B是花费时间最短的节点,它只需要2分钟。
步骤2:计算通过节点B,到达它的邻居节点需要花费的时间。
这里写图片描述
这里写图片描述
但是若是从起点经过B点再到达A点,只需要花费5分钟。
这里写图片描述
对于B的邻居节点,当你发现有花费时间更短的路径时,更新该邻居节点的花费时间。在这 个例子中,你发现

• 到达A节点用时更短的路径(从6分钟减少到5分钟)
• 到达终点更短的路径(时间从无穷大到7分钟)
步骤3 重复上面的步骤1和步骤2. 重复步骤1:找到用时最短的节点。节点B已经计算过了,用时第2少的是节点A。
这里写图片描述
重复步骤2:更新A的邻居节点的耗费时间。
这里写图片描述
WOO,现在到达终点只需要花费6分钟。 你已经对每一个极点都执行过迪杰斯特拉算法了,这个例子中,我们知道: • 到达B节点,需要花费2分钟;
• 到达A节点,需要花费5分钟;
• 到达终点,需要花费6分钟。
这里写图片描述
下一步中,我们学习如何计算最终路径,现在我们直接给出最终路径: 起点—>B—>A—终点。
这里写图片描述

广度优先深度算法没有找出用时最短的路径,因为用时最短的路径它有3个边。但是存在有2 个边也可以到达终点的路径。因此广度优先算法找到的路径是只有2个边。
这里写图片描述

上一章中吧,我们用广度优先算法找到了两点之间的最少路径。换句话说,最少路径是边最
少,但是若是图中的每条边都有权值,迪杰斯特拉算法可以找到花费最短时间的路径。
这里写图片描述

复习一下,第杰斯特拉算法算法总共分四步: 1.找到有最小权值的节点,这个节点花费的时间最少; 2,若是经过它到达它的邻居节点,花费的时间更短,更新它的邻居节点的花费时间(权 值 );
3.一直重复知道所有的节点都遍历过了; 4.计算最终路径(下一部分会讲到)
术语
现在我们来看几个例子,在这之前

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值