前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何加快Dijkstra算法的运行速度?

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

作者头像
爬蜥
发布2024-02-22 10:11:34
1500
发布2024-02-22 10:11:34
举报
文章被收录于专栏:爬蜥的学习之旅

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

Dijkstra算法

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

Bi-Directional Search

具体操作位,从源点和从目标两个方向均开始搜索,轮流的执行。两个方向的搜索意味着,在初始化的时候将有两个路径值:

d_f[u]
d_f[u]

:向前搜索最短路径、

d_b[u]
d_b[u]

向后搜索最短路径;两个最小优先级队列

Q_f
Q_f

Q_b
Q_b

;对应的前一个节点指向

\pi_f
\pi_f

\pi_b
\pi_b

;以及

S_f
S_f

S_b
S_b

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

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

对于选出的顶点u,当他'同时'被前向搜索和后向搜索处理完成,或者说是‘同时’从

Q_f
Q_f

Q_b
Q_b

中删除了,此时可以结束。

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

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

向前搜索:从源点出发,使用Dijkstra算法,可以计算出

Q_f
Q_f

={a(3),u(5),b(

\infty
\infty

),t(

\infty
\infty

)},

S_f
S_f

={s(0)}

向后搜索:从目标出发,使用Dijkstra算法,可以计算出

Q_b
Q_b

={a(

\infty
\infty

),s(

\infty
\infty

),b(3),u(5)},

S_b
S_b

={t(0)}

向前搜索:从

Q_f
Q_f

中移除的最小值为

d_f[a]
d_f[a]

=3,执行边(a,b)的Relax操作,可得到

Q_f
Q_f

={u(5),b(6),t(

\infty
\infty

)},

S_f
S_f

={s(0),a(3)}

向后搜索:从

Q_b
Q_b

中移除最小值为

d_b[b]
d_b[b]

=3,执行边(a,b)的Relax操作,可以计算出

Q_b
Q_b

={a(6),s(

\infty
\infty

),u(5)},

S_b
S_b

={t(0),b(3)}

向前搜索:从

Q_f
Q_f

中移除的最小值为

d_f[u]
d_f[u]

=5,执行边(u,t)的Relax操作,可得到

Q_f
Q_f

={b(6),t(10)},

S_f
S_f

={s(0),a(3),u(5)}

向后搜索:从

Q_b
Q_b

中移除最小值为

d_b[u]
d_b[u]

=5,执行边(s,u)的Relax操作,可以计算出

Q_b
Q_b

={a(6),s(10)},

S_b
S_b

={t(0),b(3),u(5)}

此时的u达到了终止的条件,同时从

Q_f
Q_f

Q_b
Q_b

中删除,按照前向搜索和后向搜索的指针去计算最短路径,发现为10,很明显不是最短路径。

正确的计算方式为:当终止之后,应该找到一个顶点x,使得

d_f[x]
d_f[x]

d_b[x]
d_b[x]

最小。具体措施为,看

S_f
S_f

Q_f
Q_f

中的所有节点,看它在

S_b
S_b

Q_b
Q_b

中值,使得

d_f[x]
d_f[x]

d_b[x]
d_b[x]

最小

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

附录

算法导论(MIT 6.006 第18讲)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Bi-Directional Search
    • Bi-Directional Search的结束条件是什么?
      • 当 Bi-Directional Search的结束的时候,如何找到最短路径?
      • 附录
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档