Weighted Graphs最短路径算法理解

Dijkstra's Algorithm (戴克斯特拉算法)

是由荷兰计算机科学家 Edsger Wybe Dijkstra( 戴克斯特拉 )在1956年设计的算法。

这个算法用于依次找出距离指定点最近的点,先找出最近的点,再找出第二近的点,直到找完所有的点。

其方法是先以指定点的所有相邻点为候选点,找出最近的点,然后将这个最近点的所有相邻点加入到候选点中,再次进行所有候选大PK,这样就可以找到第二近的点,不断这样循环处理,就将所有的点按照距离指定点的距离依次排列出来了。而这样得到的路径也就是从指定点到各个点的最短路径,因为已是最短,没有更短了。

如何证明这一算法的正确性呢?

首先将所有点按照指定点的相邻点分类,也就是说,所有通过某个相邻点通往指定点的点集为一类,这一类点集就由这个相邻点为入口、为统领、为必经之路,因为是必经之路,所以每一类点中距离指定点最近的距离必然是相邻点本身,因此,距离指定点最近的相邻点就是离指定点最近的点。

接下来证明第二近点,除了之前选剩的相邻点,还要再加上最近点的相邻点,它们一起形成第二近点的候选名单,为什么呢?同样可以按照上面的分类原理来证明,这些新增候选点分散接手了第一近点的旧部,成为新的通往指定点的入口点,是那些旧部通往指定点的必经之路,因此计算这些候选点距离指定点的最小距离,就得到了第二近的点。

剩下的就是同理了,这样就依次找到了距离指定点最近的点,且它们就是到各点到指定点的最短路径。

如何找到一个点到另一个点的最短路径?

上述Dijkstra's Algorithm (戴克斯特拉算法)可以找到一个点到另一个点的最短路径,问题是比较耗时,因为它在找的过程中是自我中心主义,丝毫没有顾及要找的是到另一个指定点的距离,那有没有更快速的算法可以找到从一个点到另一个点的最短路径呢?

沿袭之前算法的思路,找最短路径的关键是如何选拔候选点,从起点出发,起点的相邻点肯定都是候选点,如何新增候选点就是关键问题,新增候选点的算法不能再用之前的与起点距离最短的算法,而是要照顾到与终点的距离,如何计算与终点的距离?如果只是单纯的Weighted Graph,那是无解的,但现实中,每个点通常都有固定的位置坐标,因此可以用它们的位置坐标来计算点与点之间的距离,这样,我们选择每个候选点(与起点的实际最短距离 + 与终点的坐标距离)来作为扩展新的候选点的指标,任何一个候选点竞标成功,就将它的所有相邻点晋升为新的候选点,而自己就可以功成身退了,因为它的所有相邻点都将在路径中携带它来参与后续的竞标。在竞标过程中,我们没有损失任何一个可能产生最短路径的候选点,只是不断增加赢面最大的新的候选点,而最终能夺取王冠明珠的是实际到达终点距离最小的候选点。这个算法叫A*算法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuzen

您的资助将帮助我创作更好的作品

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值