深度优先搜索(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://xiahunao.cn/news/2775673.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 MC协议可以在串口通信,也可以在以太网通信,有A-1E和Qna-3E两种模式,这两种都是三菱PLC通信协议中比较常用的两种,一般我们使用比较多的是以太网通信,对于FX5U系列/Q系列/Qna系列/L系列的PLC,…

目标检测 | 卷积神经网络(CNN)详细介绍及其原理详解

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。它的设计灵感来自于生物学中视觉皮层的工作原理。CNN的核心思想是通…

Stable Diffusion教程——使用TensorRT GPU加速提升Stable Diffusion出图速度

概述 Diffusion 模型在生成图像时最大的瓶颈是速度过慢的问题。为了解决这个问题,Stable Diffusion 采用了多种方式来加速图像生成,使得实时图像生成成为可能。最核心的加速是Stable Diffusion 使用了编码器将图像从原始的 3512512 大小转换为更小的 46…

Leetcode刷题笔记题解(C++):面试题 08.07. 无重复字符串的排列组合

思路:因为字符之间互不相同,故使用全排列的方式去解题; 字符串长度为n,将第一个字母分别与后面每一个字母进行交换,生成n种不同的全排列;再用第二个元素与后面每一个元素进行交换,生成n - 1种不…

Transformer的PyTorch实现之若干问题探讨(一)

《Transformer的PyTorch实现》这篇博文以一个机器翻译任务非常优雅简介的阐述了Transformer结构。在阅读时存在一些小困惑,此处权当一个记录。 1.自定义数据中enc_input、dec_input及dec_output的区别 博文中给出了两对德语翻译成英语的例子: # S: de…

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(10)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(9) 4.2 PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备&…

Vue源码系列讲解——虚拟DOM篇【二】(Vue中的DOM-Diff)

目录 1. 前言 2. patch 3. 创建节点 4. 删除节点 5. 更新节点 6. 总结 1. 前言 在上一篇文章介绍VNode的时候我们说了,VNode最大的用途就是在数据变化前后生成真实DOM对应的虚拟DOM节点,然后就可以对比新旧两份VNode,找出差异所在&…

MATLAB知识点:使用逻辑值修改或删除矩阵元素

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章 3.4.4 逻辑运算 3.4.4.3 使用逻辑值修改或删…

Elasticsearch(四)

是这样的前面的几篇笔记,感觉对我没有形成知识体系,感觉乱糟糟的,只是大概的了解了一些基础知识,仅此而已,而且对于这技术栈的学习也是为了在后面的java开发使用,但是这里的API学的感觉有点乱!然…

熔断机制解析:如何用Hystrix保障微服务的稳定性

微服务与系统的弹性设计 大家好,我是小黑,在讲Hystrix之前,咱们得先聊聊微服务架构。想象一下,你把一个大型应用拆成一堆小应用,每个都负责一部分功能,这就是微服务。这样做的好处是显而易见的,更新快,容错性强,每个服务可以独立部署,挺美的对吧?但是,问题也随之而…

PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证

文章目录 Openssl操系统默认的CA证书的公钥位置Nginx Https 自签证书Nginx Https 使用CA签发证书客户端使用自签证书供服务端验证客户端使用 根证书 签发客户端证书 供服务端验证 Openssl https://www.openssl.net.cn/ openssl是一个功能丰富且自包含的开源安全工具箱。 它提…

放假--寒假自学版 day1(补2.5)

fread 函数: 今日练习 C语言面试题5道~ 1. static 有什么用途?(请至少说明两种) 1) 限制变量的作用域 2) 设置变量的存储域 2. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始…

无心剑七绝《龙年大吉》

七绝龙年大吉 龙腾五岳九州圆 年吼佳音万里传 大漠苍鹰华夏梦 吉人天相铸奇缘 2024年2月8日 平水韵一先平韵 这首藏头七绝《龙年大吉》是无心剑为2024年春节所创作的诗作。2024年是农历的甲辰年,即龙年。在中国传统文化中,龙是吉祥的象征,代表…

PSM-Net根据Stereo图像生成depth图像

一、新建文件夹 在KITTI数据集下新建depth_0目录 二、激活anaconda环境 conda activate pt14py37三、修改submission.py文件 3.1 KITTI数据集路径 parser.add_argument(--datapath, default/home/njust/KITTI_DataSet/00/, helpselect model)3.2 深度图像输出路径 save…

【复现】九思OA系统 SQL注入漏洞_43

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 九思软件自主研发的iThink协同OA办公自动化系统是面向中高端企业、政府机关和事业单位、等大型企业的协同办公软件,面…

pythn-scipy 查漏补缺

1. 2. 3. 4. 5. 6. 7. 8. 9. 偏度 skewness,峰度 kurtosis

TS学习与实践

文章目录 学习资料TypeScript 介绍TypeScript 是什么?TypeScript 增加了什么?TypeScript 开发环境搭建 基本类型编译选项类声明属性属性修饰符getter 与 setter方法static 静态方法实例方法 构造函数继承 与 super抽象类接口interface 定义接口implement…

Linux操作系统基础(二):Linux操作系统概述

文章目录 Linux操作系统概述 一、Linux起源 二、Linux 的含义 三、Linux发行版 Linux操作系统概述 一、Linux起源 Linux创始人——林纳斯 托瓦兹 Linux 诞生于1991年,作者上大学期间实现的 Linux的特点:开源、免费、拥有最为庞大的源码贡献者 …

nginx+flask+Gunicorn反代理服务拿不到真实IP的解决

背景 本人在宝塔linux环境,要部署flask的简单后端并且用Ngnix反代理,用Gunicorn框架部署。(o(╥﹏╥)o中间磕磕绊绊总算部署上去了,需要了解Gunicorn怎么部署的朋友,评论区留言,我加补一篇介绍)…

VuePress + Travis CI + Github Pages 全自动上线文档

整体思路 1.Github 创建项目,本地创建切换到 docs 分支,通过 VuePress 构建文档项目(写一些文档),上传至 Github。 2.Travis CI 自动 clone 后安装依赖、编译、上传至 Github master 分支。 3.通过 GitHub Pages 功…