广度优先搜索算法(Breath-first Search)是如何搜索一张图的?
算法导论(MIT 6.006 第13讲)
什么是图搜索?
搜索可以理解为探索,给定一个图上的点S和A,需要找到从S到A的一个路径
图的基础概念
一个图用 G=(V,E)
表示,V是顶点的集合,E是边的集合。如下所示有两种图
- 无向图,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 //走下一层
复制代码
以无向图为例
- 初始状态,处于第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
复制代码
- 以新的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)
优点
- 当想知道某个节点到原点s的最短路径时,可以直接从level上获取,并且parent提供的指针就是这条路径
- 能直接感知到从s能否到达某个节点t
广度优先搜索算法(Breath-first Search)是如何搜索一张图的?相关推荐
- Python实现 宽度/广度优先搜索算法, 深度优先搜索算法
Python实现 宽度/广度优先搜索算法, 深度优先搜索算法 1. 二叉树图 2. 宽度/广度优先搜索算法(Breadth First Search,BSF) 3. 深度优先搜索算法 4. 宽度/广度 ...
- bfs广度优先搜索算法_图的广度优先搜索(BFS)
bfs广度优先搜索算法 What you will learn? 您将学到什么? How to implement Breath first search of a graph? 如何实现图的呼吸优先 ...
- 算法(三):图解广度优先搜索算法
算法(三):图解广度优先搜索算法 算法简介 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS: ...
- 广度优先搜索算法(BFS)详解
参考:https://www.cnblogs.com/tianqizhi/p/9914539.html 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的 ...
- BFS广度优先搜索算法//宽度优先搜索算法
BFS宽度优先搜索算法,又称广度优先搜索,是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型. Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想. ...
- 广度优先搜索算法及其MATLAB实现
摘要 广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其 ...
- 深度优先搜索算法(Depth-First-Search,DFS)与广度优先搜索算法(Breadth-First Search,BFS)理解
最近学习到了这两种经典的算法,谈一下自己的理解 深度优先搜索算法(Depth-First-Search,DFS) 这个算法会尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现节点v ...
- JavaScript实现breadth First Search广度优先搜索算法(附完整源码))
JavaScript实现breadth First Search广度优先搜索算法(附完整源码) LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList ...
- boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序
boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 实现功能 C++实现代码 实现功能 boost::graph模块实现深度优先搜索 和广度优先搜索算法的测试程序 C++实现代 ...
最新文章
- c语言交错级数前10项和,怎么求一个交错级数的和,谢谢
- Python3学习笔记(二):基本数据类型
- 冯小刚导演系列公益短片之羽泉版
- UML从需求到实现---类图(2)
- redirect_uri参数错误解决方法
- 海思芯片怎么使用tde给qt加速_基于Hisi芯片,交叉编译、移植Qt4.8.6(可旋转)
- .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用
- C++复数的运算、运算符重载
- Oracle数据库中文乱码问题
- java判断1到1000素数_JAVA作业.找出1~1000以内的质数
- 计算机基础相关知识面试题
- CF1313C2 Skyscrapers (hard version) -单调栈优化dp
- 【教资必过!!!】思想品德课程理论基本知识
- 【Java小游戏】两小时制作大鱼吃小鱼小游戏项目
- android 检查更新 卡住,阴阳师安装更新包卡住怎么办_安装更新包卡住解决办法...
- 2PC、XA、DTP与两阶段提交
- Oralce数据库ASM存储管理-存储IO故障,disk未及时offline分析,故障分析模板
- PHP:【微信小程序】初识微信小程序,微信小程序配置
- 非常棒的开源协同办公OA项目,收藏了!
- qda二次判别_R语言线性分类判别LDA和二次分类判别QDA实例