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

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

Dijkstra算法

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

Bi-Directional Search
具体操作位,从源点和从目标两个方向均开始搜索,轮流的执行。两个方向的搜索意味着,在初始化的时候将有两个路径值:df[u]:向前搜索最短路径、db[u]向后搜索最短路径;两个最小优先级队列 Qf、Qb;对应的前一个节点指向 πf、πb;以及Sf、Sb
向前搜索:沿着源点向目标搜索
向后搜索:沿着目标向源点搜索
Bi-Directional Search的结束条件是什么?
对于选出的顶点u,当他’同时’被前向搜索和后向搜索处理完成,或者说是‘同时’从Qf、Qb中删除了,此时可以结束。
在这里插入图片描述

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

向前搜索:从源点出发,使用Dijkstra算法,可以计算出Qf={a(3),u(5),b(∞),t(∞)},Sf={s(0)}
在这里插入图片描述

向后搜索:从目标出发,使用Dijkstra算法,可以计算出Qb={a(∞),s(∞),b(3),u(5)},Sb={t(0)}

这里写图片描述

向前搜索:从Qf中移除的最小值为 df[a]=3,执行边(a,b)的Relax操作,可得到Qf={u(5),b(6),t(∞)},Sf={s(0),a(3)}

这里写图片描述

向后搜索:从Qb中移除最小值为db[b]=3,执行边(a,b)的Relax操作,可以计算出Qb={a(6),s(∞),u(5)},Sb={t(0),b(3)}

这里写图片描述

向前搜索:从Qf中移除的最小值为 df[u]=5,执行边(u,t)的Relax操作,可得到Qf={b(6),t(10)},Sf={s(0),a(3),u(5)}

这里写图片描述

向后搜索:从Qb中移除最小值为db[u]=5,执行边(s,u)的Relax操作,可以计算出Qb={a(6),s(10)},Sb={t(0),b(3),u(5)}

这里写图片描述

此时的u达到了终止的条件,同时从Qf和Qb中删除,按照前向搜索和后向搜索的指针去计算最短路径,发现为10,很明显不是最短路径。
正确的计算方式为:当终止之后,应该找到一个顶点x,使得df[x]+db[x]最小。具体措施为,看Sf、Qf中的所有节点,看它在Sb、Qb中值,使得df[x]+db[x]最小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值