深度优先搜索(DFS)与广度优先搜索(BFS):探索图与树的算法

一、引言

        在图论和树形结构中,搜索算法是寻找从起点到终点的路径的关键。其中,深度优先搜索DFS和广度优先搜索BFS是最常用且最基础的两种搜索算法。本文将详细介绍广度优先搜索BFS的原理、应用场景,并通过代码示例来展示其实现。

 

二、广度优先搜索(BFS)简介

        广度优先搜索(BFS)是一种用于遍历或搜索树或图的算法。它从根(或任意节点)开始,探索最近的节点,然后进行下一层的邻居节点,逐层向外扩展。这种策略使得BFS能够首先找到从起始点到目标点的最短路径(如果存在的话)。

三、BFS算法步骤

  • 创建一个队列,并将起始节点入队。
  • 从队列中取出一个节点,并检查它是否为目标节点。如果是,则搜索结束,返回路径。
  • 如果不是目标节点则将其所有未访问过的邻居节点入队并标记这些邻居节点为已访问。
  • 重复步骤2和3,直到队列为空或者找到目标节点。

四、BFS的应用场景

  • 最短路径问题:在图中查找从源点到目标点的最短路径。
  • 图的遍历:访问图中的所有节点。
  • 迷宫求解:在迷宫中找到从起点到终点的路径。

五、BFS代码示例(Python)

下面是一个简单的BFS实现,用于在无向图中搜索路径:

from collections import deque  def bfs(graph, start, end):  visited = set()  queue = deque([start])  while queue:  vertex = queue.popleft()  if vertex == end:  return True  for neighbour in graph[vertex]:  if neighbour not in visited:  visited.add(neighbour)  queue.append(neighbour)  return False  # 示例图(使用邻接表表示)  
graph = {  'A': ['B', 'C'],  'B': ['A', 'D', 'E'],  'C': ['A', 'F'],  'D': ['B'],  'E': ['B', 'F'],  'F': ['C', 'E'],  
}  # 测试BFS函数  
print(bfs(graph, 'A', 'F'))  # 输出: True  
print(bfs(graph, 'A', 'D'))  # 输出: True  
print(bfs(graph, 'A', 'G'))  # 输出: False

        在这个示例中,我们定义了一个bfs函数,它接受一个图(以邻接表形式表示)、一个起始节点和一个目标节点作为输入。函数使用队列来存储待访问的节点,并使用一个集合来跟踪已访问的节点。如果找到目标节点,函数返回True;否则,返回False


 六、结论

        广度优先搜索(BFS)是一种强大的图遍历算法,它在许多应用场景中都发挥着重要作用。通过理解BFS的原理和实现,我们可以更好地解决图论中的各种问题,如最短路径、图的遍历和迷宫求解等。

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

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

相关文章

VMware17上安装centos7.9成功后,进入linux命令行以后,运行没几分钟直接卡死,或者说非常卡

VMware17上安装centos7.9成功后,进入linux命令行以后,运行没几分钟直接卡死,或者说非常卡 解决方案:关闭windows的Hyper-V服务,重启虚拟机

Android性能调优 - 应用安全问题

Android应用安全 1.组件暴露: 像比如ContentProvider,BroadcastReceiver,Activity等组件有android:exported属性; 如果是私有组件 android:exported “false”; 如果是公有组件 android:exported “true” 且进行权限控制&…

互联网加竞赛 基于深度学的图像修复 图像补全

1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学的图像修复 图像补全 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-se…

idea代码review工具Code Review Helper使用介绍

之前在团队里面遇到一个关于代码review的问题,使用gitlab自己的还是facebook的Phabricator,很难看到整体逻辑,因为业务逻辑代码可能不在这次改动范围内,在去源库中找不好找。针对这个刚需,在网上找了一个idea的代码工具…

Nginx与history路由模式:刷新页面404问题

使用nginx部署前端项目,路由模式采用history模式时,刷新页面之后,显示404。 路由模式 前端路由的基本作用为: ①当浏览器地址变化时,切换页面; ②点击浏览器后退、前进按钮时,更新网页内容&…

【Git】Windows下通过Docker安装GitLab

私有仓库 前言基本思路拉取镜像创建挂载目录创建容器容器启动成功登录仓库设置中文更改密码人员审核配置邮箱 前言 由于某云存在人数限制,这个其实很好理解,毕竟使用的是云服务器,人家也是要交钱的。把代码完全放在别人的服务器上面&#xf…

C++算法之双指针、BFS和图论

一、双指针 1.AcWing 1238.日志统计 分析思路 前一区间和后一区间有大部分是存在重复的 我们要做的就是利用这部分 来缩短我们查询的时间 并且在使用双指针时要注意对所有的博客记录按时间从小到大先排好顺序 因为在有序的区间内才能使用双指针记录两个区间相差 相当于把一个…

前端JavaScript篇之原型链的终点是什么?如何打印出原型链的终点?

目录 原型链的终点是什么?如何打印出原型链的终点? 原型链的终点是什么?如何打印出原型链的终点? 在 JavaScript 中,原型链是由对象和原型对象组成的链式结构。每个对象都有一个原型对象,并通过 __proto__…

自动化测试po模式是什么

一、什么是PO模式 全称:page object model 简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BasePage:封装一些最基…

职业性格测试在求职应聘跳槽中的应用

人的性格总是千奇百怪,有的人总是想迎接挑战,超越自己,不停的奔着高处走,然而有的人总是喜欢随遇而安,踏踏实实一辈子,有份安稳的工作,有吃有喝就好。那么对于哪些喜欢迎接挑战,但又…

猫头虎分享:ECMAScript Modules规范示例详解

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Slider组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Slider组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Slider组件 滑动条组件,通常用于快速调节设置值,如音量调…