dijkstra算法 - 到起点距离最短的点优先遍历
-
算法原理不再详述,给出两篇参考文章,看完就懂:
-
自己的理解:
- dijkstra算法得到的结果是单源的,即必须设定一个起点A,等到遍历完所有点之后,得到的结果是点A到所有剩余点的最短距离和最短路径。如果起点换成B,那就要重新设定B为起点,然后运行一遍算法;
- dijkstra算法采用了动态规划的思想,如果要求点A到点B的最短路径,就先求出点A到点B的父节点的最短路径;
- dijkstra算法是一个广度优先遍历(BFS)算法,使用了优先级队列,每次从队列中取出到起点路径最短的点优先遍历。使用优先级队列和使用普通队列的区别是,普通队列是拥有相同深度(同层)的节点同时遍历,而使用优先级队列是拥有相同路径长度(同权)的节点同时遍历,如果所有节点之间移动的代价(权)是相等的,则dijkstra就退化为BFS算法;
- 选定了起点之后,所有的节点都要遍历,没有方向性,时间复杂度较高;
最佳优先搜索算法 - 到终点距离最短的点优先遍历
- 和dijkstra算法唯一的不同,在于优先级队列的,dijkstra算法的优先级是该点到起点的距离,即到起点距离最短的点优先遍历。而最佳优先搜索算法的优先级是该点到终点的距离,即到终点距离最短的点优先遍历。
A*算法 - 结合上两种方法
- 优先级:
f ( n ) = g ( n ) + h ( n ) f(n)=g(n)+h(n)