在之前的课我们讲过了Dijkstra算法,先回顾下,如下图:

那么如果加速DIjkstra算法寻找最短路径呢?这节课上讲师讲了两种方法:双向搜索(Bi-Directional Search)目标方向搜索(Goal-Directed Search)

一、 双向搜索(Bi-Directional Search)

在正式介绍双向搜索方式前,需要介绍下一个它的双向概念是什么样的,如下图所示:

总结来说就是forward和backward方向上分别定义各自的图变量(例:当前最小路径权重和df, db 当前点的predecessor∏f, ∏b, 当前点的优先队列Qf, Qb)。

那么,现在有两个问题:

(1)双向搜索的中止条件是什么

答:在前向和后向搜索时,点被处理(即从各自优先队列中删去)。

(2)怎么找到点s到t的最短路径

答:如果点w都第一次在优先队列Qf, Qb中被处理掉,那么在前向图上,找到点s到w的最短路径在后向图上,找到t到w的最短路径。之后将它们相加即可得到图(不含负权重)的最短路径。但这个会有个问题:w有可能不在最短路径上。我们来看个例子,就能很好的理解这个问题是为什么了,请见下图:

所以,我们能发现如果单纯按上面方法找最短路径,最后可能找到的会是最短长度路径,而非最短权重路径。该问题的解决方法很简单,如下图所示,就是找到一个x点,它是df(x) + db(x)的最小值即可。

二、目标方向搜索(Goal-Directed Search)

假设我们有个图,点s到v1的权重是5,点s到v2的权重也是5,那么有没有什么办法能让我们知道哪条路径是最小路径的可能性会大些?答:有。只要根据下图所示的函数重新修改edge上的权重,我们就能更方便的找到最小路径的方向了。

[MIT6.006] 18. Speeding up Dijkstra 加速Dijkstra算法的更多相关文章

  1. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  2. Dijkstra最短路算法

    Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...

  3. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

  4. Dijkstra和Prim算法的区别

    Dijkstra和Prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的点集合A ...

  5. 【坐在马桶上看算法】算法7:Dijkstra最短路算法

           上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径 ...

  6. [MIT6.006] 1. Algorithmic Thinking, Peak Finding 算法思维,峰值寻找

    [MIT6.006] 系列笔记将记录我观看<MIT6.006 Introduction to Algorithms, Fall 2011>的课程内容和一些自己补充扩展的知识点.该课程主要介 ...

  7. [MIT6.006] 16. Dijkstra

    先回顾下上节课的内容: 下面来看一个定理:对于所有的点来说,放松操作总是满足 d[v] ≥ δ(s, v).即点s到点v的最短路径总是小于或等于当前点d的路径权重.证明如下: 在正是进入复杂的图前,先 ...

  8. Dijkstra和Floyd算法

    #include #include #include #define Infinity 999 //最大值 #define Max_Vertex_Num 20 //顶点数最多为20 #define L ...

  9. 最短路径问题的Dijkstra和SPFA算法总结

    Dijkstra算法: 解决带非负权重图的单元最短路径问题.时间复杂度为O(V*V+E) 算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短 ...

随机推荐

  1. iOS使用NSTextAttachment添加图片,图片模糊

    最近在忙的项目中,需要处理富文本的相关内容,产品需求并不复杂,所以想着用TextKit处理,顺便学习一下,没想到直接掉坑.在此记录一下(都是血泪史),顺便为有需要的小伙伴提供参考. // Add th ...

  2. day30 Pyhton 面向对象 继承.装饰器

    一面向对象相关 谈谈你对面向对象的理解 1.泛泛谈:什么情况下使用面向对象 2.针对面向对象的 封装 继承 多态一个一个的谈 3.根据你工作中的实际情况对应来举例子 封装 1.广义上:普遍的大家认为的 ...

  3. .NET Core+MongoDB集群搭建与实战

    目录 安装 MongoDB apt 直接安装(方法1) apt 仓库安装(方法2) 方法1.2启动 MongoDB 通过二进制包安装(方法3) 安装依赖 deb 安装 MongoDB tgz 安装 M ...

  4. php使用xpath爬取内容

    <?php $html = file_get_contents('https://tieba.baidu.com/f?kw=%C9%EE%BB%A7&fr=ala0&loc=re ...

  5. go cap和len区别

    首先要搞清楚容量和长度的区别: 容量是指底层数组的大小,长度指可以使用的大小 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否则,go 会新申请一个底层 ...

  6. PHP7下的协程实现 转

        前言 相信大家都听说过『协程』这个概念吧. 但是有些同学对这个概念似懂非懂,不知道怎么实现,怎么用,用在哪,甚至有些人认为yield就是协程! 我始终相信,如果你无法准确地表达出一个知识点的话 ...

  7. lumen中间件 Middleware

    app/http 下新建 TestMiddleware.php <?php namespace App\Http\Middleware; use Closure; class TestMiddl ...

  8. Excel 导出的方法 之二

    // <summary> /// 导出到Excel lichenghu /// </summary> /// <param name="dt"> ...

  9. C#文件反序列化

    前言 最近,为了实现Unity游戏数据的加密,我都把注意力放到了C#的加密方式身上,最简单的莫过于C#的序列化了,废话不多说,直接开始 准备工作 在使用文件反序列化前我们得先引用命名空间 using ...

  10. mysql 必会基础3

    1.limit [偏移量,0表示没偏移,在第一行:1表示偏移一行,在第二行:默认值为0] 需要展现的记录数 分页的应用: int curPage = 2; int pageSize = 10; int ...