算法图解笔记——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)。
针对非加权图,广度优先搜索是适用的,而要计算加权图的最短路径,可使用狄克斯特拉算法。图中可以还存在环,意味着可从一个节点出发,走了一圈后又回到这个节点。对于路径中,存在环,可以选择绕过,也可以选择包含环的路径并且你可以选择绕环多次,但每绕环一次,权重会增加一次。
看了上述的