BFS(Breath First Search 广度优先搜索)

news/2025/1/13 3:20:10/文章来源:https://www.cnblogs.com/bigcat26/p/18520342

@

目录
  • 一、知识及框架
  • 二、案例说明
    • 案例1:使用bfs计算二叉树的最小高度
    • 案例2:解开密码锁的最少次数,要求:请写一个算法,初始状态为0000,拨出target的最少次数,其中避免出现deadends中的包含的任意一个死亡密码,如果永远无法拨出target,则返回-1
  • 本人其他文章链接

一、知识及框架

  1. BFS算法都是用 “队列” 结构
  2. BFS和DFS最主要区别:bfs找到的路径一定是最短的,但代价是空间复杂度比dfs大很多
  3. bfs本质:一幅图,从起点到终点,求最短路径
  4. bfs空间复杂度高,而dfs空间复杂度较低
  5. 形象点说:dfs是线,bfs是面,dfs是单打独斗,bfs是集体行动
  6. dfs和bfs的时间复杂度都是O(N)
  7. BFS干的事:从起点start到终点target的最近距离
  8. BFS应用举例:走迷宫、连连看......

※ 思考问题1:为什么bfs、dfs都可以找到最短距离,但一般都使用bfs方法,而不用dfs呢?
答:bfs是齐头并进,一旦找到终点就不找了,而dfs需要全遍历后才知道最短路径

※ 思考问题2:既然bfs那么好,为啥dfs还需要存在?
答:bfs代价太大,除找最短路径用bfs,其他情况推荐dfs

BFS框架:

二、案例说明

说明:Node节点class对象代码请查看上一篇文章,https://blog.csdn.net/a924382407/article/details/118394577

二叉树

		/*   a1:↓                           a2:↓                  a3:↓1                               1                     1/ \                                                   / \2   3                                                 2   3/ \4   5/6*/Node a1 = new Node(1, new Node(2, new Node(4), new Node(5, new Node(6), null)), new Node(3));Node a2 = new Node(1, null, null);Node a3 = new Node(1, new Node(2, null, null), new Node(3, null, null));

main函数

public static void main(String[] args){//问题3.1:使用bfs计算二叉树的最小高度System.out.println("使用bfs计算二叉树的最小高度:" + bfsMinDepth(a1));//问题3.2:解开密码锁的最少次数System.out.println("解开密码锁的最少次数:" + openLock(new String[]{"8887", "7789"}, "8888"));
}

案例1:使用bfs计算二叉树的最小高度

	//问题3.1:使用bfs计算二叉树的最小高度public static int bfsMinDepth(Node root) {if (root == null) return 0;Queue<Node> q = new LinkedList<>();q.offer(root);//root本身就是一层,将depth初始化为1int depth = 1;while (!q.isEmpty()) {int sz = q.size();//将当前队列中所有节点想四周扩散for (int i = 0; i < sz; i++) {Node cur = q.poll();//判断是否到达终点if (cur.left == null && cur.right == null) return depth;//将cur的相邻节点加入队列if (cur.left != null) q.offer(cur.left);if (cur.right != null) q.offer(cur.right);}//重点:这里增加步数depth++;}return depth;}

案例2:解开密码锁的最少次数,要求:请写一个算法,初始状态为0000,拨出target的最少次数,其中避免出现deadends中的包含的任意一个死亡密码,如果永远无法拨出target,则返回-1

	/*** 问题3.2:解开密码锁的最少次数*      要求:请写一个算法,初始状态为0000,拨出target的最少次数,其中避免出现deadends中的包含的任意一个死亡密码,如果永远无法拨出target,则返回-1*///将s[j]向上拨动一次public static String plusOne(String s, int j) {char[] ch = s.toCharArray();if (ch[j] == '9') {ch[j] = '0';} else {ch[j] += 1;}return new String(ch);}//将s[j]向下拨动一次public static String minusOne(String s, int j) {char[] ch = s.toCharArray();if (ch[j] == '0') {ch[j] = '9';} else {ch[j] -= 1;}return new String(ch);}/*** openLock* @param deadends 死亡数字* @param target  目标密码* @return 次数*/public static int openLock(String[] deadends, String target) {//记录需要跳过的死亡密码Set<String> deads = new HashSet<>();for (String s : deadends) deads.add(s);//记录已经穷举过的密码,防止走回头路Set<String> visited = new HashSet<>();Queue<String> q = new LinkedList<>();//从起点开始启动广度搜先搜索int step = 0;q.offer("0000");visited.add("0000");while (!q.isEmpty()) {int sz = q.size();//将当前队列中所有节点向四周扩散for (int i = 0; i < sz; i++) {String cur = q.poll();//判断密码是否合法,是否到达终点if (deads.contains(cur)) continue;if (cur.equals(target)) return step;//将一个节点的未遍历相邻节点加入队列for (int j = 0; j < 4; j++) {String up = plusOne(cur, j);if (!visited.contains(up)) {q.offer(up);visited.add(up);}String down = minusOne(cur, j);if (!visited.contains(down)) {q.offer(down);visited.add(down);}}}//重点:增加步数step++;}//如果穷举完都没找到目标密码,那就是找不到了return -1;}

本人其他文章链接

1.单链表题+数组题(快慢指针和左右指针)

2.BFS(Breath First Search 广度优先搜索)

3.”回溯算法“框架及练习题

4.JAVA 二叉树面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/825262.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL安装-CentOS系统

MySQL安装-CentOS系统本文在此只介绍一种安装方式,是rpm并非yum。如果需要yum的安装方式,可以查阅其他相关资料 1.去官网下载对应的安装包 官方网站:https://www.mysql.com/,找到下载DOWNLOADS,下载操作系统对应的社区版本。本文使用的数据库版本是5.7.41在社区版本下载界…

洛谷题单指南-字符串-P3369 【模板】普通平衡树

原题链接:https://www.luogu.com.cn/problem/P3369 题意解读:平衡树的基本操作,模版题。 解题思路: 1、二叉搜索树-BST 二叉搜索树满足这样的性质:每一个节点的权值大于它的左儿子,小于它的右儿子。 对BST进行中序遍历,将得到一个从小到大的有序序列,因此BST是为了维护…

vscode调式LUA(EmmyLua)

安装EmmyLUA插件或者在github中下载 https://github.com/EmmyLua/VSCode-EmmyLua https://github.com/jiehuali/VSCode-EmmyLua.git 增加调试Launch.json 打开文件夹后会变成create a launcher.json,点击Run And Debug, 选择EmmyLua New Debugger(这个是作者推荐的,更稳定些…

TSP问题-分支限界法求解

此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报 所用教材:北京大学屈婉玲教授《算法设计与分析》 课程资料:https://www.icourse163.org/course/PKU-1002525003 承诺不用于任何商业用途,仅用于学术交流和分享 更多内容请关注许志伟课题组官方中文主页:https://…

专有云是什么

专有云,或称私有云,是一种仅供特定组织或企业使用的云计算环境。本文将介绍以下几个方面:1、专有云的定义与特性;2、专有云与公有云的对比;3、专有云的应用场景;4、如何构建和管理专有云。在定义与特性部分,我们将详细探讨专有云如何通过提供独享的资源和高度定制的服务…

”回溯算法“框架及练习题

”回溯算法“框架及练习题@目录一、回溯算法是什么?二、框架如下:本人其他文章链接 一、回溯算法是什么? 结论:回溯 = 穷举 解决一个回溯问题,实际上就是一个决策树的遍历过程路径:就是已经做出的选择 选择列表:就是你当前可以做出的选择 结束条件:就是base case条件,…

Golang 开源库分享:faker - 随机生成有趣的假数据!

GitHub 仓库链接:https://github.com/bxcodec/faker 简介 在开发和测试过程中,我们经常需要各种各样的测试数据。如果手动去生成这些数据,不仅耗时,还容易出错。faker 是一个 Go 语言的假数据生成库,可以快速生成各种字段的随机数据。这个库可以帮我们轻松生成各种属性的假…

ShellScript

StorageSrvShelScript 编写添加用户的脚本,存储在/shells/userAdd.sh目录。 当有新员工入职时,管理员运行脚本为其创建公司账号。 自动分配客户端账号、公司邮箱、samba目录及权限、网站账号等。 以userAdd lifei的方式运行脚本,lifei为举例的员工姓名前提条件 完成了LDAP服…

资源利用率提高30%,揭秘华为云Serverless高效、高密度调度优化原理

本文介绍了华为云对调度优化这一业界难题的探索之路,创新性提出了基于JIAGU的高效的资源优化调度系统。Key TakeawaysUSENIX ATC(USENIX Annual Technical Conference) 是计算机系统领域国际顶级学术会议之一(CCF-A),在国际上享有极高的学术声誉,2024年录用率仅为15.8%。…

PostgreSQL技术大讲堂 - 第70讲:PG数据库数据加载调优案例

PostgreSQL技术大讲堂 - 第70讲,主题:postgresq数据库数据加载调优案例 讲课内容:1、数据库参数调整2、后台进程cpu绑定调整3、数据库并行操作调整数据加载是每个DBA经常需要完成的工作,如何让数据加载变得更快,本期视频跟大家一起分享调优带来的乐趣。主讲老师: CUUG数据…

网桥VXLAN服务

VXLAN 服务网桥VXLAN服务 在appsrv和storagesrv上搭建vxlan。需求如下, 安装实验网桥 新建vxlan隧道,网桥名称为 br-vxlan,网桥的出口为vxlan100,id 为100. appsrv的隧道地址为172.16.1.1/24,storagesrv的隧道地址为172.16.1.2/24. 测试网桥之间二层的联通性。AppSrv yum i…

微信支付商户系统Native支付

简易demo演示 demo演示点击体验### Native支付介绍 目前微信支付有以下几种场景 * JSAPi支付,适合微信公众号及微信小程序 * APP支付 * H5支付 * Native支付,适合PC网站页面支付 [微信支付商户平台](https://pay.weixin.qq.com/) [微信支付Native接口文档](https://pay.weixi…