[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的 ...
随机推荐
- MonkeyRunner+Python自动化测试一
MonkeyRunner介绍 1.monkeyrunner 工具提供了一个 API,用于编写可从 Android 代码外部控制 Android 设备或模拟器的程序.使用 monkeyrunner,您可 ...
- 关于Elasticsearch版本升级,Kibana报index迁移与需要x-pack插件问题
关于Elasticsearch版本升级,Kibana报index迁移与需要x-pack插件问题 这个问题是由于elasticsearch旧版残留文件导致,使用下述指令删除即可 查看所有elastics ...
- 多测试讲解_009肖sirRF自动化框架安装教程
robot framework:自动化测试框架 Python3.7 RIDE(可视化界面). Wxpython pip(在线下载) . setuptools(在线安装) . 第三方库 第三方库:s ...
- 从源码的角度解析Mybatis的会话机制
坐在我旁边的钟同学听说我精通Mybatis源码(我就想不通,是谁透漏了风声),就顺带问了我一个问题:在同一个方法中,Mybatis多次请求数据库,是否要创建多个SqlSession会话? 可能最近撸多 ...
- 【LWJGL3】LWJGL3的内存分配设计,第一篇,栈上分配
简介 LWJGL (Lightweight Java Game Library 3),是一个支持OpenGL,OpenAl,Opengl ES,Vulkan等的Java绑定库.<我的世界> ...
- 经验分享:对于刚接触开发的大学生,怎么在Windows查看与关闭端口占用方法?
前言:做开发有的时候会发现某一端口被占用了而导致不能正常启动服务,这个时候就需要把这个端口释放掉了,步骤如下 观察报错信息提示,了解是哪个端口号被占用,以8700为例 按win+r输入cmd打开控 ...
- selenium--数据填充
from time import sleep from selenium import webdriver br = webdriver.Chrome() url = "https://ww ...
- 一文读懂MySQL的事务隔离级别及MVCC机制
回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...
- 【API管理 APIM】如何查看APIM中的Request与Response详细信息,如Header,Body中的参数内容
问题描述 通过APIM门户或者是Developer门户,我们可以通过Test功能测试某一个接口,通过Trace可以获取非常详细的Request,Response的信息,包含Header,X-Forwa ...
- Linux命令行history
概述 当执行命令后,系统默认会在内存记录执行过的命令 当用户正常退出时,会将内存的命令历史存放对应历史文件中,默认是~/.bash_history 登录shell时,会读取命令历史文件中记录下的命令加 ...