文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。
Dijkstra不能解决的问题
在Dijkstra类似BFS,从起始节点找到距离最短的节点,一层一层向外扩展,直到找到目标节点。
在有些时候这种策略看起来比较蠢。例如在上图中要找到顶点0到顶点10的最短路径。优先选择距离最短的节点1,2,3。而这些节点显然是距离目标节点越来越远的。那么我们不再只是考虑dist这一个因素,再考虑节点与目标节点的欧几里得距离。这种策略称为启发式搜索。
那么A*搜索与Dijkstra的不同之处
1 每次选择节点的时候,考虑f = dist+欧几里得距离,为了降低计算量,用曼哈顿距离代替欧几里得距离。f值低的优先选择。
2 更新顶点dist值的时候,同时更新f值。
3 A*在查找过程中第一次遇到目标节点就退出,Dijkstra是在考虑了所有可能达到目标节点后选择的最优解。
代码