4.2《算法图解》笔记——Chapter 7 Dijkastra Algorithm

本文是关于《算法图解》中狄克斯特拉算法的笔记,解释了算法的使用、术语、案例以及负权边情况。算法用于寻找加权图中最短路径,适用于有向无环图。文中通过一个物品置换的例子展示了算法的应用,并指出在存在负权边时需使用贝尔曼-福德算法。
摘要由CSDN通过智能技术生成

算法图解笔记——Chapter 7 Dijkastra Algorithm
Author: Seven Zou
Email: zoushiqi0404@gmail.com
Language: Python2.7


7 狄克斯特拉算法

在昨天学到的了广度优先搜索,可以很好地解决最短路径问题。但如果加入时间变量问题——寻找最快的路径,就可以引入今天所学的另一种图算法——狄克斯特拉算法(Dijkstra’s Algorithm)。

7.1 算法的使用

在这里插入图片描述
这里有如上图关系,数字表示的是时间(min)。找出从起点到终点耗时最短的路径,使用狄克斯特拉算法需要如下步骤。

  • 1.找出“最便宜”的节点,即可在最短时间内到达的节点;
  • 2.更新该节点的邻居的开销,其含义将稍后叙述;
  • 3.重复这个过程,直到对图中的每个节点都这样做;
  • 4.计算最终路径。

1.找出“最便宜”的节点。从起点开始,当前状态只能获取两条信息,通往A和B的时间,且通往B的时间更短仅为2分钟。对于终点,假设为 ∞ \infty

节点 耗时
A 6
B 2
终点 ∞ \infty

2.计算经节点B通过各个邻居的时间。

节点 耗时
起点->B 2
起点->B->A 2+3=5
起点->B->终点 2+5=7

此时的时间就可以得到更新,因为获得时间出现了更优的值。

  • 前往节点A的更短路径(“起点 -> B -> A” 耗时少于 “起点 -> A”)
  • 前往终点的更短路径(耗时" ∞ \infty " -> “7”)

3.重复。刚刚针对B进行了操作,本步骤继续对A节点进行同样操作。结果发现前往终点的时间更新为6分钟。

节点 耗时
起点->A 6
起点->A->终点 6+1=7
起点->B->A->终点 2+3+1=6

此时,对每个节点都运行了狄克斯特拉算法,重新更新前往各节点的耗时数据所以第一个表格数据更新为如下。

节点 耗时
A 5
B 2
终点 6

4.最后,计算最终路径。
在这里插入图片描述
对于最短路径的概念,在广度优先搜索中,意义是段数最少。而在狄克斯特拉算法中,相当于你给每段都分配了一个数字(权重),所以算法最终是找出总权重最小的路径。现在对狄克斯特拉算法应该有了大概的认知,下面来详细介绍其中的细节知识。


7.2 术语

狄克斯特拉算法用于每条边都有关联数字的图,这些数字称为权重(weight)。因此有,带权重的图称为加权图(weighted graph),不带权重的图称为非加权图(unweighted graph)。在这里插入图片描述
针对非加权图,广度优先搜索是适用的,而要计算加权图的最短路径,可使用狄克斯特拉算法。图中可以还存在,意味着可从一个节点出发,走了一圈后又回到这个节点。对于路径中,存在环,可以选择绕过,也可以选择包含环的路径并且你可以选择绕环多次,但每绕环一次,权重会增加一次。
在这里插入图片描述
看了上述的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值