[MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索
一、图
在正式进入广度优先搜索的学习前,先了解下图:
图分为有向图和无向图,由点vertices和边edges构成。图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和解谜等。
下面拿Pocket Cube魔方(2x2x2立方体魔方)来举个例子:
对于解魔方来说,可以先构建一个初始图,画出每个小立方可能状态上的点,还有可能移动的边,示意图如上图所示,这里讲师没有过多讲解其中的数学内容,只需要了解图在魔方上的解答应用。
二、图的表示
作者讲了三种图的表示方法:邻接表(Adjacency List),面向对象法和含糊表示法。重点是邻接表。
我这里就只讲邻接表,它跟散列表看起来有点像,就是定义了所有顶点v都属于顶点集V,邻接表Adj就是一个带连接的数列表,Adj[b] = {a, c} 说明b点和a和c点之间有连接。构建一个邻接表,复杂度估为θ(|V| + |E|)。
三、广度优先搜索
- 给定一个点s,s属于顶点集V,从s连接到V中可达到的所有点。
- Ο(V + E) 复杂度。
- 在0次移动{s},1次移动Adj{s},...等移动下,查看所有可达到的点。
- 谨慎地避开重复。
下图左侧展示了BFS的伪代码:
上图右侧举例来讲这个BSF代码的运行过程:
- 首先,看点s,它是起始点,所以level=0;
- 然后看Adj[s]下与点s有连接的点,这里是点a和点x,所以parent(a)和parent(x)为s,而a和x的level为1,frontier(即next)加入a和s,进行下一步搜索;
- 然后看Adj[a]和Adj[x]下与的连接点,最后得到z,d和c,并将它们划分为level3。
- 不断重复点都划分完。
通过BSF,我们能轻松地得到图中任意两点之间的最短路径(Shortest Path),比如s到v的最短路径就是level[v]的大小,即3。
[MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索的更多相关文章
- 图的遍历BFS广度优先搜索
图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...
- 广度优先搜索(Breadth First Search, BFS)
广度优先搜索(Breadth First Search, BFS) BFS算法实现的一般思路为: // BFS void BFS(int s){ queue<int> q; // 定义一个 ...
- 关于宽搜BFS广度优先搜索的那点事
以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...
- BFS广度优先搜索 poj1915
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- GraphMatrix::BFS广度优先搜索
查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, ...
- 步步为营(十六)搜索(二)BFS 广度优先搜索
上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...
- DFS(深度优先搜索)和BFS(广度优先搜索)
深度优先搜索算法(Depth-First-Search) 深度优先搜索算法(Depth-First-Search),是搜索算法的一种. 它沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的 ...
随机推荐
- SolrCloud搭建
什么是SolrCloud? SolrCloud是基于 solr 和 zookeeper 的分布式搜索方案,它的主要思想是使用zookeeper作为SolrCloud集群的配置信息中心,统一管理Solr ...
- Swoole实时任务异步调用Demo
server.php <?php class Server { private $serv; private $logFilePath = "/data/wwwroot/houtai/ ...
- springmvc执行原理
大家是否遇到过被面试官问了这样一句话:"来聊聊springmvc执行原理".是的,springmvc的执行流程是面试的高频点,今天我就来浅谈它! 一.下面通过一个简单的spring ...
- 题解:HDU 6598
题解:HDU 6598 Description Now, Bob is playing an interesting game in which he is a general of a harmon ...
- 第十七章 nginx动静分离和rewrite重写
一.动静分离 动静分离,通过中间件将动静分离和静态请求进行分离:通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时.通过中间件将动态请求和静态请求分离,逻辑图如下: 1 ...
- Linux命令之命令别名
对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行 显示当前shell进程所有可用的命令别名 [04:33:43 root@C8[ ~]#alias alias cp='cp -i' al ...
- Vue踩坑日记-You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file.
记录时间:2019年4月24日16:55:54 在build/webpack.base.conf.js文件中,注释或者删除掉:module->rules中有关eslint的规则
- linux 查看nginx的安装路径等信息
做个随笔,记录一下. 想查看nginx的配置文件,但不知道nginx是安装在哪个目录下? ps -ef | grep nginx Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的 ...
- ssh执行命令
执行一条命令 ssh user@ip command 执行多条命令 ssh user@ip "command1;command2" #分号隔开 关于转义 ssh user@ip ' ...
- 源码安装中./configure的使用
在linux中安装源码,在源码目录下使用 ./configure --prefix=xxx --with=xxx 其中configure是一个可执行脚本, --prefix 选项就是配置安装的路径, ...