算法-狄杰斯特拉-Dijkstra Algorithm

    科技2025-06-21  7

    自己画图真的是一件很累的事情,麻烦大家互相学习引用的同时注明出处,互相学习,不胜感激。

    一、最短图路径算法

    1、Dijkstra Algorithm

    是一个贪心算法 解决的是带权重的有向图上单源最短路径问题,并且所有权值非负基本思想:从源点出发,每次选择离源点最近的一个顶点前进,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径

    2、Floyd-Warshall Algorithm:动态规划算法

    任意两点之间的最短路径,这称为多源最短路径问题

    二、Pseudocode

    DIJKSTRA(G,w,s) ​ 1. INITIALIZE_SINGLE_SOURCE(G,s) 2. S=∅ 3. Q=G.V 4. while Q≠∅ 5. u=EXTRACT_MIN(Q) 6. S=S∪{u} 7. for each vertex v∈G.Adj[u] 8. RELAX(u,v,w) S:已访问过节点集合 Q:保存节点集合(最小优先队列) u:最小的节点 RELAX(u,v,w):松弛操作

    三、推导

    简要分为8步,来进行分析和推导
    1、初始化

    2、找到第一个点A,遍历他,此时,由于A和其他点之间的距离位置,均初始化为∞

    3、第一个点A已访问完成,找到他可到达的节点为B和C,此时,B和C节点的具体分别为6和3,均比∞小,故修改到A的最短距离。

    4、由于和A相连的点有B和C,此时,按照伪代码第5步来说,需要找到最小的点,接着遍历,故开始遍历C点。与C点相连的点有B、D、E,故此时基于已有的A-C的距离为3的基础,开始计算距离,分别为5、6、7

    5、同理可得,取最小的点,开始遍历B,计算与其相关的点的距离。

    6、遍历D

    7、遍历E

    8、至此,到了F点后,所有的点遍历完成。路径如下表所示,一目了然。

    四:总结

    时间复杂度:

    设图的边数为E,顶点数为V

    依赖于最小优先队列的实现数据结构 通过节点1~|V|数组,第V个的值存在第V个位置 :O( V^{2} + E) =O(V^{2}) 使用斐波那契堆 O(Vlg{V} + E) = O( Vlg{V} )

    缺陷:当所搜索的图存在非负值时, 导致u—>v之间存在一条负权回路

    [参考资料]

    算法导论第三版

    写在最后

    打个小广告:希望大家关注三个程序猿的成长史 微信号:Technology Army

    Processed: 0.009, SQL: 8