算法导论(MIT 6.006 第13讲)

什么是图搜索?

搜索可以理解为探索,给定一个图上的点S和A,需要找到从S到A的一个路径

图的基础概念

一个图用 G=(V,E) 表示,V是顶点的集合,E是边的集合。如下所示有两种图

  1. 无向图,V={a,b,c},E={{a,b},{b,c},{a,c}}

2. 有向图,V={a,b,c},E={(a,b),(b,a),(c,a),(b,c)}

实际应用有哪些?

网络爬虫、社交网络、网络包传播、垃圾回收算法等

如何用算法表示图?

使用邻接表。它是一个数组(Adj表示)大小是 |V|,每个元素是指向一个链表的指针,遍历的方法如下

for each vertex u in VAdj[u] stores u's neighbors
复制代码

比如,上所述的有向图来说 Adj[a]={b},Adj[b]={a,c},对无向图来讲 Adj[a]={(a,c),(a,b)}

这种表现形式所需要的空间大小为 (V+E),|V|个顶点和|E|条边

广度优先算法是如何搜索一张图的?

目标:对于一个给定的节点S V,通过它来遍历它所能到达的所有节点
时间要求:O(V+E)
思路:查看给定节点,通过0步移动,能够到达的节点,这个节点就是s本身,然后从s移动一步,也就是s的邻接表,找到他能到达的节点,依次类推,需要避免重复

BFS(s,Adj):level={s:0} //第0步能到达的节点parent={s:None}i=1 //第0步就是s,已经到达,从第一步开始frontier=[s] //前一层已经经过的节点 level=i-1while frontier: //在已经经过的节点找它的相邻节点next=[] //当前层找到的节点for u in frontier:for v in Adj[u]:if  v not in level: //当前节点没有在其它层出现过,从而避免重复level[v]=i parent[v]=unext.append(v)frontier=next i+=1 //走下一层
复制代码

以无向图为例

  1. 初始状态,处于第0层,i=0,s没有父节点,已经经过的节点只有s

2. 从s移动0步,s的相邻节点是a和x,他们没有在之前的level存在,所以需要添加到level中。执行完后

level={s:0,a:1,x:1}
parent={s:None,a:s,x:s}
frontier={a,s}
i=2
复制代码

3. 以新的frontier为基础,再往前一步,发现a有z和s,但是s已经经历过了,不再添加,依次类推x。执行完之后

level={s:0,a:1,x:1,z:2,x:2}
parent={s:None,a:s,x:s,z:a,d:x,c:x}
frontier={z,d,c}
i=3
复制代码
  1. 以新的frontier为基础,再往前一步,发现z的唯一邻接节点只有a,但是a已经在level 1中,不再添加。执行完之后
level={s:0,a:1,x:1,z:2,x:2,f:3,v:3}
parent={s:None,a:s,x:s,z:a,d:x,c:x,f:d,v:c} frontier优先存的是d
frontier={f,v}
i=4
复制代码

5. 以新的frontier为基础,再往前一步,发现f,v的邻接节点都已经计算过,不再计入,因此最后

frointer={}
i=5
复制代码

至此结束

耗时分析

BFS所做的策略是先找到每一层的节点,再去找它的邻接表,耗时可以从两部分来看,1个是必须遍历所有节点,为V,另外每一层遍历的边的数量为 vV,即每个顶点的边的个数,对于有向图来讲是E,无向图就是2E,这样总的时间就是 (V+E)

优点

  1. 当想知道某个节点到原点s的最短路径时,可以直接从level上获取,并且parent提供的指针就是这条路径
  2. 能直接感知到从s能否到达某个节点t

广度优先搜索算法(Breath-first Search)是如何搜索一张图的?相关推荐

  1. Python实现 宽度/广度优先搜索算法, 深度优先搜索算法

    Python实现 宽度/广度优先搜索算法, 深度优先搜索算法 1. 二叉树图 2. 宽度/广度优先搜索算法(Breadth First Search,BSF) 3. 深度优先搜索算法 4. 宽度/广度 ...

  2. bfs广度优先搜索算法_图的广度优先搜索(BFS)

    bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...

  3. 算法(三):图解广度优先搜索算法

    算法(三):图解广度优先搜索算法 算法简介 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS: ...

  4. 广度优先搜索算法(BFS)详解

    参考:https://www.cnblogs.com/tianqizhi/p/9914539.html 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的 ...

  5. BFS广度优先搜索算法//宽度优先搜索算法

    BFS宽度优先搜索算法,又称广度优先搜索,是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型. Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想. ...

  6. 广度优先搜索算法及其MATLAB实现

    摘要 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其 ...

  7. 深度优先搜索算法(Depth-First-Search,DFS)与广度优先搜索算法(Breadth-First Search,BFS)理解

    最近学习到了这两种经典的算法,谈一下自己的理解 深度优先搜索算法(Depth-First-Search,DFS) 这个算法会尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现节点v ...

  8. JavaScript实现breadth First Search广度优先搜索算法(附完整源码))

    JavaScript实现breadth First Search广度优先搜索算法(附完整源码) LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList ...

  9. boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序

    boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 C++实现代 ...

最新文章

  1. c语言交错级数前10项和,怎么求一个交错级数的和,谢谢
  2. Python3学习笔记(二):基本数据类型
  3. 冯小刚导演系列公益短片之羽泉版
  4. UML从需求到实现---类图(2)
  5. redirect_uri参数错误解决方法
  6. 海思芯片怎么使用tde给qt加速_基于Hisi芯片,交叉编译、移植Qt4.8.6(可旋转)
  7. .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用
  8. C++复数的运算、运算符重载
  9. Oracle数据库中文乱码问题
  10. java判断1到1000素数_JAVA作业.找出1~1000以内的质数
  11. 计算机基础相关知识面试题
  12. CF1313C2 Skyscrapers (hard version) -单调栈优化dp
  13. 【教资必过!!!】思想品德课程理论基本知识
  14. 【Java小游戏】两小时制作大鱼吃小鱼小游戏项目
  15. android 检查更新 卡住,阴阳师安装更新包卡住怎么办_安装更新包卡住解决办法...
  16. 2PC、XA、DTP与两阶段提交
  17. Oralce数据库ASM存储管理-存储IO故障,disk未及时offline分析,故障分析模板
  18. PHP:【微信小程序】初识微信小程序,微信小程序配置
  19. 非常棒的开源协同办公OA项目,收藏了!
  20. qda二次判别_R语言线性分类判别LDA和二次分类判别QDA实例

热门文章

  1. Java IO(五)——字符流进阶及BufferedWriter、BufferedReader
  2. canvas - drawImage()方法绘制图片不显示的问题
  3. Oracle数据库merge into的使用,存在则更新,不存在则插入
  4. 《Linux KVM虚拟化架构实战指南》——第1章 KVM虚拟化概述 1.1XEN虚拟化介绍
  5. C语言常用代码组织形式
  6. PLSQL Developer简单使用教程
  7. 抹去阴影,搞定了Cyclone III
  8. MSF安装失败的原因
  9. 剔除字符串中重复的字符
  10. 在行进中开火 Fire and Motion By Joel Spolsky