Python 算法基础篇之图的遍历算法:深度优先搜索和广度优先搜索
Python 算法基础篇之图的遍历算法:深度优先搜索和广度优先搜索
- 引言
- 1. 图的遍历概述
- 2. 深度优先搜索( DFS )
- 2.1 DFS 的实现
- 2.2 DFS 的应用场景
- 3. 广度优先搜索( BFS )
- 3.1 BFS 的实现
- 3.2 BFS 的应用场景
- 4. 示例与实例
- 总结
引言
图的遍历是计算机科学中的一项重要任务,用于查找和访问图中的所有节点。深度优先搜索( DFS )和广度优先搜索( BFS )是两种常用的图遍历算法。本篇博客将重点介绍这两种算法的原理、应用场景以及使用 Python 实现,并通过实例演示每一行代码的运行过程。
😃😄 ❤️ ❤️ ❤️
1. 图的遍历概述
在图中,遍历是指通过一定的方式访问图中的所有节点。图的遍历是一种常见的问题,例如查找图中是否存在某个节点,查找两个节点之间的路径,或者查找图中的连通分量等。
图的遍历算法可以分为深度优先搜索( DFS )和广度优先搜索( BFS )。这两种算法在不同场景下有不同的优势,深度优先搜索通常用于查找路径和连通分量等问题,广度优先搜索通常用于查找最短路径等问题。
2. 深度优先搜索( DFS )
深度优先搜索是一种递归的图遍历算法,其基本思想是从起始节点开始,沿着一条路径访问图中的节点,直到无法继续访问为止,然后回溯到上一个节点,继续访问其他的路径,直到遍历完所有节点。
2.1 DFS 的实现
下面是深度优先搜索算法的 Python 实现:
def dfs(graph, node, visited):if node not in visited:visited.append(node)for neighbor in graph[node]:dfs(graph, neighbor, visited)return visited
代码解释:上述代码定义了一个深度优先搜索函数 dfs ,该函数接收一个图 graph 、起始节点 node 和一个空的已访问列表 visited 作为参数,并返回遍历后的节点列表。在函数中,我们首先检查当前节点是否已经被访问过,如果没有,则将其添加到已访问列表中,并递归地访问它的所有邻居节点。
2.2 DFS 的应用场景
深度优先搜索在许多场景中都有应用,例如:
- 查找图中两个节点之间是否存在路径;
- 查找图中的连通分量;
- 判断图中是否存在环等。
3. 广度优先搜索( BFS )
广度优先搜索是一种非递归的图遍历算法,其基本思想是从起始节点开始,依次访问其所有邻居节点,然后再访问邻居节点的邻居节点,直到遍历完所有节点为止。
3.1 BFS 的实现
下面是广度优先搜索算法的 Python 实现:
from collections import dequedef bfs(graph, start):visited = []queue = deque([start])while queue:node = queue.popleft()if node not in visited:visited.append(node)queue.extend(graph[node])return visited
代码解释:上述代码定义了一个广度优先搜索函数 bfs ,该函数接收一个图 graph 和起始节点 start 作为参数,并返回遍历后的节点列表。在函数中,我们使用一个队列 queue 来保存待访问的节点,从起始节点开始,依次将其邻居节点加入队列中,并继续访问邻居节点的邻居节点,直到队列为空。
3.2 BFS 的应用场景
广度优先搜索在许多场景中都有应用,例如:
- 查找图中两个节点之间的最短路径;
- 查找图中的连通分量;
- 拓扑排序等。
4. 示例与实例
现在我们创建一个示例图,并使用深度优先搜索和广度优先搜索进行遍历。
# 创建一个示例图
graph = {'A': ['B', 'C'],'B': ['A', 'C', 'D'],'C': ['A', 'B', 'D', 'E'],'D': ['B', 'C', 'E', 'F'],'E': ['C', 'D'],'F': ['D']
}# 使用DFS遍历图
print("深度优先搜索结果:", dfs(graph, 'A', []))# 使用BFS遍历图
print("广度优先搜索结果:", bfs(graph, 'A'))
运行上述代码,输出结果如下:
深度优先搜索结果: ['A', 'B', 'C', 'D', 'E', 'F']
广度优先搜索结果: ['A', 'B', 'C', 'D', 'E', 'F']
总结
本篇博客重点介绍了图的遍历算法:深度优先搜索和广度优先搜索。深度优先搜索通过递归的方式遍历图中的节点,广度优先搜索通过队列的方式遍历图中的节点。每一种算法都有其特定的应用场景,可以根据具体问题选择合适的算法。
图的遍历是计算机科学中的基础算法,它在图的应用中起到了至关重要的作用,例如社交网络中的好友关系分析、路网中的最短路径规划等。
相关文章:
Python 算法基础篇之图的遍历算法:深度优先搜索和广度优先搜索
Python 算法基础篇之图的遍历算法:深度优先搜索和广度优先搜索 引言 1. 图的遍历概述2. 深度优先搜索( DFS )2.1 DFS 的实现2.2 DFS 的应用场景 3. 广度优先搜索( BFS )3.1 BFS 的实现3.2 BFS 的应用场景 4. 示例与实例…...
文本缩略 文本超出显示省略号 控制超出省略的行数
文本缩略 .abb{//超出一行省略overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }超出2行省略 .abb2{display: -webkit-box !important;-webkit-box-orient: vertical;//超出2行省略-webkit-line-clamp:2;overflow: hidden; }控制超出省略的行数 .txt-over{/*控…...
云原生架构
1. 何为云原生? 很多IT业内小伙伴会经常听到这个名词,那么什么是云原生呢?云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。 当今时代,众多企业希望构建高度可扩展、灵活且有弹性的应用程序,以便能够快…...
Java 生成随机数据
文章目录 1. Java-faker依赖demo 2. common-random依赖demo 1. Java-faker 依赖 <dependency><groupId>com.github.javafaker</groupId><artifactId>javafaker</artifactId><version>1.0.2</version> </dependency>https://…...
基于OpenCV的红绿灯识别
基于OpenCV的红绿灯识别 技术背景 为了实现轻舟航天机器人实现红绿灯的识别,决定采用传统算法OpenCV视觉技术。 技术介绍 航天机器人的红绿灯识别主要基于传统计算机视觉技术,利用OpenCV算法对视频流进行处理,以获取红绿灯的状态信息。具…...
JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器
JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器 在当今丰富的网络环境中,处理 PDF 文档已成为企业和开发人员的必需品。ComPDFKit 是一款支持 Web 平台并且功能强大的 PDF SDK,开发人员可以利用它创建 PDF 查看器和编辑器&…...
Flutter 网络请求
在Flutter 中常见的网络请求方式有三种:HttpClient、http库、dio库; 本文简单介绍 使用dio库使用。 选择dio库的原因: dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载…...
吃透《西瓜书》第三章 线性模型:多元线性回归
🍉 吃瓜系列 教材:《机器学习》 周志华著 🕒时间:2023/7/26 目录 一、多元线性回归 1 向量化 1.1.1 向量化 1.1.2 使用最小二乘法构建损失函数 1.1.3 去除求和符号,改成向量点乘的形式 1.1.4 数学原理 2 求解…...
数据结构【排序】
第七章 排序 一、排序 1.定义:将无序的数排好序 ; 2.稳定性: Kᵢ和Kⱼ中,Kᵢ优先于Kⱼ那么在排序后的记录中仍然保持Kᵢ优先; 3.评价标准:执行时间和所需的辅助空间,其次是算法的稳定性…...
探索APP开发的新趋势:人工智能和大数据的力量
随着5G技术的不断发展,人工智能和大数据将会更加广泛的应用于我们生活和工作中,作为 APP开发公司,应该及时的对新技术进行研发,进而更好的为用户服务。目前 APP开发已经不是传统的软件开发了,而是向移动互联网转型&…...
超越传统:深入比较Bootstrap、Foundation、Bulma、Tailwind CSS和Semantic UI的顶级CSS框架!
探索流行的CSS框架:Bootstrap vs Foundation vs Bulma vs Tailwind CSS vs Semantic UI 在Web开发中,选择适合项目需求的CSS框架可以极大地简化界面设计和响应式布局的工作。本文将详细介绍一些流行的CSS框架,并提供代码示例和比较ÿ…...
基于深度学习淡水鱼体重智能识别模型研究
工作原理为:首先对大众淡水鱼图片进行数据清洗并做标签分类,之后基于残差网络ResNet50模型进行有监督的分类识别训练,获取识别模型。其次通过搭建回归模型设计出体重模型,对每一类淡水鱼分别拟合出对应的回归方程,将获…...
Nginx专题(1)--linux安装nginx
ngixn安装 安装依赖包 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl-devel 安装nginx 下载nginx的tar包 登录http://nginx.org/en/download.html,下载nginx的Stable version版本,并解压 #执行c…...
系统集成中级计算汇总
基本计算: EV 挣值 (实际完成的工作量) AC 实际发生的花费 PV 计划花费(预算) CV 成本 SV 进度 CV 和 SV 的计算 都是通过EV 减去另一个值 CV EV-AC SV EV-PV 成本 chengben C 开头 所以CV 是成本 CV 中有个C 所以用到的是 AC ,另外一个则是剩余的PV CV SV 计算…...
json.stringify的高级用法,和for of的原理
** /* for of 是用来循环可迭代属性的,如何判断是否是可迭代属性,数据原型链上有个Symbol.iterator说明这个数据是可迭代数据 Symbol.iterator是一个函数,调用此函数,会返回一个对象,对象的内部有一个next函数,调用next函数会返回一个对象这个对象内部有value和done值…...
SpringCloudAlibaba微服务实战系列(三)Sentinel1.8.0+流控
SpringCloudAlibaba–Sentinel Sentinel被称为分布式系统的流量防卫兵,是阿里开源流量框架,从服务限流、降级、熔断等多个纬度保护服务。Sentinel同时提供了简洁易用的控制台,可以看到接入应用的秒级数据,并可以在控制台设置一些…...
mybatis - no getter for property,以及@JsonIgnore
There is no getter for property named user_full_name in class com.book.erp.entity.user.QueryUser Mybatis 配置错误,XML配置文件有Java对象以及数据库字段,配置时需要小心 user_full_name是数据库字段,不需要有get 和 set方法…...
云原生周刊:K8s v1.28 中的结构化身份验证配置
开源项目推荐 KubeLinter KubeLinter 是一种静态分析工具,用于检查 Kubernetes YAML 文件和 Helm 图表,以确保其中表示的应用程序遵循最佳实践。 DB Operator DB Operator 减轻了为 Kubernetes 中运行的应用程序管理 PostgreSQL 和 MySQL 实例的痛苦…...
支持向量机概述
支持向量机在深度学习技术出现之前,使用高斯核的支持向量机在很多分类问题上取得了很好的结果,支持向量机不仅用于分类,还可以用于回归问题。它具有泛化性能好,适合小样本和高维特征的优点。 1. SVM引入 1.1支持向量机分类 支持向量机的基本模型是定义在特征空间上的间隔…...
安装x265
一、编译libx265源码 libx265是用CMAKE编译的,故先下cmake,我是centos系统,命令: yum install cmake -y进入目录./x265_1.9/build/linux/下,执行脚本: sh make-Makefiles.bash选择好之后,输入…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
