专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

如何加快Dijkstra算法的运行速度?

在Dijkstra算法中,面对单源单目标的最短路径,如果遇到了要relax的节点u就是目标节点t,显然就可以执行结束了。

Dijkstra算法

Dijkstra算法的探索路径是从源一直往目标前景,那么加速它的一个角度就是从源开始探索的时候,同时从目标点向源开始探索,这种算法即Bi-Directional Search。

Bi-Directional Search

具体操作位,从源点和从目标两个方向均开始搜索,轮流的执行。两个方向的搜索意味着,在初始化的时候将有两个路径值:93_1.png:向前搜索最短路径、93_2.png向后搜索最短路径;两个最小优先级队列 93_3.png93_4.png;对应的前一个节点指向 93_5.png93_6.png;以及93_7.png93_8.png

  • 向前搜索:沿着源点向目标搜索
  • 向后搜索:沿着目标向源点搜索

Bi-Directional Search的结束条件是什么?

对于选出的顶点u,当他’同时’被前向搜索和后向搜索处理完成,或者说是‘同时’从93_9.png93_10.png中删除了,此时可以结束。

当 Bi-Directional Search的结束的时候,如何找到最短路径?

可能想到的思路是,如果u是第一个满足结束条件的,那么沿着各自的前向指针,即可找到最短路径。以如下搜索为例:

93_11.png向前搜索:从源点出发,使用Dijkstra算法,可以计算出 93_12.png={a(3),u(5),b( 93_13.png),t( 93_14.png)}, 93_15.png={s(0)}

93_16.png向后搜索:从目标出发,使用Dijkstra算法,可以计算出 93_17.png={a( 93_18.png),s( 93_19.png),b(3),u(5)}, 93_20.png={t(0)}

93_21.png

向前搜索:从93_22.png中移除的最小值为 93_23.png=3,执行边(a,b)的Relax操作,可得到93_24.png={u(5),b(6),t(93_25.png)},93_26.png={s(0),a(3)}

93_27.png向后搜索:从 93_28.png中移除最小值为 93_29.png=3,执行边(a,b)的Relax操作,可以计算出 93_30.png={a(6),s( 93_31.png),u(5)}, 93_32.png={t(0),b(3)}

93_33.png

向前搜索:从93_34.png中移除的最小值为 93_35.png=5,执行边(u,t)的Relax操作,可得到93_36.png={b(6),t(10)},93_37.png={s(0),a(3),u(5)}

93_38.png向后搜索:从 93_39.png中移除最小值为 93_40.png=5,执行边(s,u)的Relax操作,可以计算出 93_41.png={a(6),s(10)}, 93_42.png={t(0),b(3),u(5)}

93_43.png此时的u达到了终止的条件,同时从 93_44.png93_45.png中删除,按照前向搜索和后向搜索的指针去计算最短路径,发现为10,很明显不是最短路径。
正确的计算方式为:当终止之后,应该找到一个顶点x,使得 93_46.png+ 93_47.png最小。具体措施为,看 93_48.png93_49.png中的所有节点,看它在 93_50.png93_51.png中值,使得 93_52.png+ 93_53.png最小

另一种算法为Goal-Directed Search ,详见 www.researchgate.net/publication…

附录

算法导论(MIT 6.006 第18讲)

文章永久链接:https://tech.souyunku.com/47263

未经允许不得转载:搜云库技术团队 » 如何加快Dijkstra算法的运行速度?

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们