算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础
广度优先搜索(Breadth First Search)用于按离始节点距离、由近到远渐次访问图的节点,可视化BFS
通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue)
最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance:
// LeetCode 690. Employee Importance
/*
class Employee {
public:
int id;
int importance;
vector<int> subordinates;
};
*/
// Input: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1 Output: 11
class Solution {
public:
int getImportance(vector<Employee*> employees, int id) {
int res=;
unordered_map<int,Employee*> m;
for(Employee* e:employees) m[e->id]=e;
queue<Employee*> q;
q.push(m[id]);
while(!q.empty()){
Employee* cur=q.front();q.pop();
res+=cur->importance;
for(auto s:cur->subordinates) q.push(m[s]);
}
return res;
}
};
相关LeetCode题:
513. Find Bottom Left Tree Value 题解
拓扑排序(Topological Sort)也应用了BFS遍历思想、以达成按依赖关系排序的目的,关于拓扑排序见:算法与数据结构基础 - 拓扑排序(Topological Sort)
层信息
BFS思路是从某节点层层往外扩展,一些场景下我们需要处理层(level)相关的信息,例如 LeetCode题目 102. Binary Tree Level Order Traversal:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root==NULL) return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int size=q.size();
vector<int> tmp;
for(int i=;i<size;i++){ //处理当前level
TreeNode* cur=q.front();q.pop();
tmp.push_back(cur->val);
if(cur->left) q.push(cur->left);
if(cur->right) q.push(cur->right);
}
res.push_back(tmp);
}
return res;
}
};
以上代码不单遍历了树节点,还加了按层(level)处理,注意以上代码与遍历代码的细微差别。
相关LeetCode题:
102. Binary Tree Level Order Traversal 题解
429. N-ary Tree Level Order Traversal 题解
111. Minimum Depth of Binary Tree 题解
993. Cousins in Binary Tree 题解
515. Find Largest Value in Each Tree Row 题解
最短距离
BFS另一个重要的应用就是求最短路径,可以是单点到单点、单点到多点、多点到多点之间的路径。
当问题出现最小(minimum)、最短(shortest)等字样时可考虑用BFS求解,一般求解思路是 1/找出满足条件的起始点,2/由起始点开始进行BFS,3/遇到终点结束。
相关LeetCode题:
以上例题路径之间没有差别,更复杂的一种情况是路径具备权重。对有权图求解最短路径,一般情况下会想到Bellman-Ford、Dijkstra算法,而BFS思想是这些算法思想的核心。
相关LeetCode题:
因问题不同、访问临近节点的方式各异,在使用BFS时我们可能会遇到重复访问某一节点的情况。
为了避免重复访问节点造成死循环,常用hashtable来记录节点是否已经被访问。
相关LeetCode题:
864. Shortest Path to Get All Keys 题解
算法与数据结构基础 - 广度优先搜索(BFS)的更多相关文章
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 算法与数据结构基础 - 队列(Queue)
队列基础 队列具有“先进先出”的特点,用这个特点我们可以用它来处理时间序列相关或先后次序相关的问题,例如 LeetCode题目 933. Number of Recent Calls,时间复杂度O(1 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
随机推荐
- Spring之bean生命始末
可以为Bean定制初始化后的生命行为,也可以为Bean定制销毁前的生命行为.举例:ba06包.首先,这些方法需要在Bean类中事先定义好:是方法名随意的public void方法. 其次,在配置文件的 ...
- Spring Cloud Gateway使用
简介 Spring Cloud Gateway是Spring Cloud官方推出的网关框架,网关作为流量入口,在微服务系统中有着十分重要的作用,常用功能包括:鉴权.路由转发.熔断.限流等. Sprin ...
- ElasticSearch搜索引擎的入门实战
1.ElasticSearch简介 引用自百度百科: ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elas ...
- .NET Core IdentityServer4实战 第Ⅳ章-集成密码登陆模式
回顾下ClientCredentials模式,在ReSourceApi中定义了我们公开服务,第三方网站想要去访问ReSourceApi则需要在身份验证服务中获取toekn,根据token的内容,硬编码 ...
- 音视频技术“塔尖”之争,网易云信如何C位出道?
音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ...
- 计算广告之CTR预测--PNN模型
论文为:Product-based Neural Networks for User Response Prediction 1.原理 给大家举例一个直观的场景:比如现在有一个凤凰网站,网站上面有一个 ...
- Jenkins的安装与使用(一)
jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...
- jenkin+Git子模块自动拉取代码
jenkins+Git子模块自动拉取代码 添加Git子模块 先克隆想要添加子模块的仓库git clone ssh://git@ip:port/user/project.git,这个是主目录. 进入仓库 ...
- 学习kafka自己发生的几个小错误记录
一. The method iterator() is ambiguous ConsumerIterator<byte[],byte[]> it =stream.iterator(); ...
- 将GMap封装为Activex供QT使用(工具:VS2017,QT5.12) 更新部署到其它电脑
由于一开始定的开发平台在QT下,到后面要加入地图控件.qt里本身带有地图qmap(在qt的官方案例中可以找到,用qml做的),但只有固定的几个地图源,要做google或者bing地图,时间和人力不允许 ...