1. 课程笔记
如上图所示,用节点代表村庄,用各边代表村庄之间的道路,用权重代表村庄之间的距离
注意:边权重非负
The goal is to find a path for the start node A to the end node E that minimizes the sum of the weights
首先用距离值0对起点进行标记,用红色表示节点已经被访问或处理;
然后,对节点A相邻的节点进行标记,这里是B、D、F节点,用蓝色表示当前正在讨论的、列表中的节点;
蓝色节点后面的数字表示起始点到该节点的最短路径长度
下次迭代,访问节点B,因为在所有蓝色节点中,B对应的距离最短
访问B的所有相邻点,发现点C路径长度为8,这是我们目前所知的去往节点C的最短路径。
下次迭代,访问节点D
当访问节点D的所有相邻节点时,发现有一条能到达节点C的更短的路径,即由D再到C,于是,将节点C的值更新为5
下次迭代,访问节点F
当访问节点F的所有相邻节点时,得到了一条抵达节点G的更短路径,于是,将节点G的值更新为9
下次迭代,访问节点C
当访问节点C的所有相邻节点时,我们发现,已经找到了一条抵达终点E的路径
在最后的迭代中,图表在E处构建结束
Dijkstra算法伪代码:
图中的节点有两个属性,一个是距离值,一个是父节点,用这些属性找到从终点开始回到起点的路;
每一次迭代,将选择列表中具有最小距离值的关联节点,并更新该节点的邻居(标记距离值和访问状态);
一旦抵达终点,就可以通过将现在的终点设置为起点来重建路径,从每个节点不断移动到其父级,直至抵达起始节点。
该算法的计算复杂度与节点数量和各边上权重有关(节点数与距离值)
该算法的低级版本实现起来不难,但是计算复杂度会随着节点数量增加而呈现二次式的增加
通过使用优先级队列的数据结构,可以更巧妙地实现节点列表排序,将计算复杂度降低,使他增速更慢。
2. 其它参考学习资源推荐
一篇详尽易懂的关于Dijkstra算法的文章:路径规划—详解Dijkstra算法
【注意:这篇文章讲解的第六次以及第七次迭代过程有错误,我已经在该博主评论区留言更正】
3. 算法复现效果
这是我完成的该课程对应的作业情况:
在该作业指定的地图中:
在我自定义的地图中: