作者小头像 Lv.2
73 成长值

个人介绍

致力于编程语言研究,偶尔思考一下黎曼猜想

感兴趣或擅长的领域

微服务架构、编程语言
个人勋章
TA还没获得勋章~
成长雷达
70
3
0
0
0

个人资料

个人介绍

致力于编程语言研究,偶尔思考一下黎曼猜想

感兴趣或擅长的领域

微服务架构、编程语言

达成规则

发布时间 2022/05/16 11:56:02 最后回复 嘟嘟瑞 2023/07/16 07:02:08 版块 CodeArts
446 1 0
他的回复:
     小步最短路径算法      小步最短路径算法的路径值在每次迭代中,只增加最小的量,以使得确定路径值的节点数量不为0且最少,可一次性确定一个或多个节点的所有最短路径。 相比Dijkstra算法,小步最短路径算法会显著降低计算量,且能充分利用硬件的高并行能力。      现有最短路径算法主要建立在基于松弛操作的Dijkstra算法之上。设S为已经找到最短路径的节点集,Q为还未找到最短路径的节点集。Dijkstra算法对最近加入S中的节点u,考察每个与u相连且不在S中的节点v,即在dist[u]+length(u,v)    2. 确定节点h的最短路径=0,在处理节点h时,更新节点f的路径=3,更新节点g的路径信息=4;黑实线表示节点路径值发生更新      3. 确定节点f的最短路径=3,在处理节点f时,会更新节点b的路径信息=13,会更新节点e的路径信息=11,g的路径信息不变;虚线表示更失败      4. 确定节点g的最短路径=4,在处理节点g时,会更新节点d的路径信息=12,会更新节点e的路径信息=6,邻接节点f已确定最短路径;删除的黑实线表示该更新被其他更新替换      5. 确定节点e的最短路径=6,在处理节点e时,为节点b新增一条路径为13的路径,会更新节点a的路径信息=12,会更新节点d的路径信息=12,邻接节点f已确定最短路径;节点b存在两条等长最短路径      6. 确定节点a/d的最短路径=12,在处理节点a/d时,不需要更新任何节点的路径信息;邻接边和状态共享先处理a的情形      7. 确定节点b的最短路径=13,在处理节点b时,不需要更新任何节点的路径信息。      小步最短路径算法更新节点的路径过程为:初始化时,更新节点h的最短路径信息=0;Pathlength最小增加到3,确定节点f的最短路径=3,邻接边变为已处理(在确定的最短路径中的邻接边);Pathlength最小增加到4,确定节点g的最短路径=4,邻接边变为已处理,邻接边变为无效(不在任何最短路径中的已处理邻接边);Pathlength最小增加到6,确定节点e的最短路径=6,邻接边变为已处理,邻接边变为无效;Pathlength最小增加到12,确定节点a/d的最短路径=12,邻接边/变为已处理,邻接边和变为无效;Pathlength最小增加到13,确定节点b的最短路径=13,邻接边/变为已处理,邻接边变为无效。      小步最短路径算法,确定的路径信息都是最短路径,且在每次迭代中得到所有长度相同的最短路径。在具体实现时,可把节点的邻接边边按权重值升序排列,以提高运行的效率。并通过一个集合,跟踪确定最短路径但存在未处理邻接边的节点,这是小步算法引入的新的计算量,需要用一个最小堆维护下个确定最短路径的节点,其复杂度与Dijkstra算法中维护Q的复杂度相同。      小步最短路径算法具有巨大并发优势,可并行计算多个节点的最短路径。如存在k*n个等长的最短路径时,可通过k个线程并发处理。      小步最短路径算法通过避免无效的节点路径更新,可显著降低计算量。Dijkstra算法在确定一个节点的最短路径后,会尝试更新所有在Q中的邻接节点的路径值;而小步算法在确定一个节点的最短路径后,不会更新任何人和节点的路径值。在上例中,Dijkstra算法尝试次更新路径值的次数与边的数量正相关,而小步最短路径算法更新路径值的次数与节点数量正相关。