算法-图的广度优先搜索,图的深度优先搜索

1.图的广度优先搜索
(1). 定义
图的广度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索树或图的算法。这个算法从图的某一节点(源节点)开始,探索最靠近源节点的节点,然后是一层一层地向外扩展,直到找到目标节点或遍历完整个图。

下面是广度优先搜索的基本步骤:
a. 创建一个队列,将源节点入队。
b. 对源节点执行访问,同时标记其已经被访问。
c. 当队列不为空时,循环执行以下步骤:
c.1. 从队列中取出一个节点。
c.2. 遍历该节点的所有邻居节点。如果邻居节点未被访问过,访问此节点,再将其加入队列和标记其已经被访问。
d. 算法结束。

在广度优先搜索中,所有从源节点出发,到达同一层级的节点,都会被一同处理。因此,广度优先搜索可以找到从源节点到目标节点的最短路径(如果目标节点存在的话),这里的“最短”指的是路径上边的数量最少。

在编程实现广度优先搜索时,通常会用到队列这种数据结构,因为队列的特性是先进先出(FIFO),这正好符合广度优先搜索逐层向外扩展的需求。

值得注意的是,广度优先搜索在某些情况下可能不是最优的,例如当图很大或者结构复杂时,它可能需要遍历很多节点才能找到目标节点。在这种情况下,可能需要考虑使用其他搜索算法,如深度优先搜索(DFS)或启发式搜索算法等。

(2). 实例
在这里插入图片描述
针对上述图结构,我们可以借助广度优先搜索计算并打印一条AG的边数最少的路径.

2.图的深度优先搜索
(1). 定义
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

在图的深度优先搜索中,基本的思想是从某个顶点v开始,首先访问该顶点,然后依次从v的未被访问的邻接点出发,对图进行深度优先遍历,直至图中和v有路径相通的顶点都被访问。如果此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

深度优先搜索的具体步骤可以总结如下:
(1). 访问顶点v
(2). 依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问。

若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。需要注意的是,深度优先搜索的结果可能不唯一,因为搜索的顺序可能因不同的邻接点选择顺序而有所变化。

深度优先搜索在许多应用中都有重要的作用,如网络爬虫、人工智能、编译器设计等。在网络爬虫中,深度优先搜索可以帮助我们按照特定的路径去遍历网页;在人工智能中,深度优先搜索可以用于求解迷宫问题等;在编译器设计中,深度优先搜索可以用于语法分析树的构建等。

总的来说,深度优先搜索是一种强大且灵活的算法,可以处理各种复杂的图结构问题。
(2). 实例
在这里插入图片描述
上述是一个由边和节点构成的图结构.我们可以利用深度优先搜索找到从AE的所有可行路径.并输出其中边数最少的一条路径的变数,及路径上的节点信息.

class NodeInfo{
public:char m_nName;
};template<class T>
class Node{
public:T m_nEle;
};template<class EdgeInfo>
class Edge{
public:bool m_bValid = false;
};Node<NodeInfo> stNodes[10];
Edge<int> stEdges[10][10];
int ArrPath[1000][10];
int PathNum = 0;
int MinPath[10];
int MinNum = 10;
void Visit(int nCurIndex, int nEndIndex, int (&ArrIndex)[10], int nNum);
int main(){stNodes[0].m_nEle.m_nName = 'A';stNodes[1].m_nEle.m_nName = 'B';stNodes[2].m_nEle.m_nName = 'C';stNodes[3].m_nEle.m_nName = 'D';stNodes[4].m_nEle.m_nName = 'E';stNodes[5].m_nEle.m_nName = 'F';stNodes[6].m_nEle.m_nName = 'G';stNodes[7].m_nEle.m_nName = 'H';stNodes[8].m_nEle.m_nName = 'I';stNodes[9].m_nEle.m_nName = 'J';stEdges[0][1].m_bValid = true;stEdges[0][6].m_bValid = true;stEdges[1][2].m_bValid = true;stEdges[2][3].m_bValid = true;stEdges[2][5].m_bValid = true;stEdges[3][4].m_bValid = true;stEdges[5][3].m_bValid = true;stEdges[5][9].m_bValid = true;stEdges[6][5].m_bValid = true;stEdges[6][8].m_bValid = true;stEdges[7][6].m_bValid = true;stEdges[8][7].m_bValid = true;stEdges[8][9].m_bValid = true;stEdges[9][4].m_bValid = true;// 找到从A到E的所有可能路径int nFirstIndex = 0;int nEndIndex = 4;int ArrIndex[10];int nNum = 0;// 深度优先遍历Visit(nFirstIndex, nEndIndex, ArrIndex, nNum);// 打印结果printf("min path:%d\n", MinNum);for(int i = 0; i < MinNum; i++){printf("%c ", stNodes[MinPath[i]].m_nEle.m_nName);}printf("\n");printf("path num:%d\n", PathNum);while(true){printf("path index:\n");int nIndex = 0;scanf("%d", &nIndex);getchar();if(nIndex < 0){break;}for(int i = 0; i < 10; i++){printf("%c ", stNodes[ArrPath[nIndex][i]].m_nEle.m_nName);}printf("\n");}return 0;
}
// 从nCurIndex开始到nEndIndex的所有路径
void Visit(int nCurIndex, int nEndIndex, int (&ArrIndex)[10], int nNum){// 访问当前节点//stNodes[nCurIndex].m_nEle.m_bVisit = true;ArrIndex[nNum] = nCurIndex;nNum++;if(nCurIndex == nEndIndex){// 记录for(int i = 0; i < nNum; i++){ArrPath[PathNum][i] = ArrIndex[i];}PathNum++;// 比较&更新if(nNum < MinNum){MinNum = nNum;for(int i = 0; i < nNum; i++){MinPath[i] = ArrIndex[i];}}return;}// 在当前阶段基础上,继续走向每个分支for(int i = 0; i < 10; i++){int nOldNum = nNum;// 从当前沿着此分支继续走下去if(stEdges[nCurIndex][i].m_bValid){// 剪分支// 待访问节点不能已经出现在累计的访问路径上.将环路排除在结果外.int k = 0;for(; k < nNum; k++){if(ArrIndex[k] == i){break;}}if(k >= nNum){Visit(i, nEndIndex, ArrIndex, nNum);}}// 分支走完需要撤销影响.以便继续从当前沿着后续分支继续走.防止数据被污染.走的过程中需要记录和更新的内容已经记录下来了.nNum = nOldNum;}
}

上述算法是一个典型的深度优先,递归,动态规划性质的算法.
此类算法典型特征:
(1). 递归算法.
(2). 参数部分提供当前阶段,截止阶段信息(方便知道何时停止后续递归),累计到当前的阶段性信息.
(3). 访问当前设计对阶段性信息记录,及到达截止阶段时比较&更新全局信息.
(4). 从当前节点继续走向可行分支.
要走向的分支得存在.
需要进行剪枝分析.具体到上述,因为我们要求解最短路径,所以,需剪掉出现环路的分支.
(5). 走完一个分支后,需防止数据被污染.要分析从上一分支走的过程中那些数据被污染了,并判断是否需恢复.具体到上述,我们维护的阶段性信息被污染了.重新走后续分支时,我们需将其恢复到走首个分支前的状态.因为上述我们需借助阶段性信息来记录从起点到终点的路径信息.

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

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

相关文章

EDIUS11新版中国首发!新增多个AI功能比Sora更强!

2024年2月27日&#xff0c;中国苏州 - 著名专业视频剪辑工具EDIUS正式推出中国地区的最新版本EDIUS11。这次发布距上一版已有3年时间&#xff0c;EDIUS11带来了一系列创新&#xff0c;开发商Grass Valley团队引入了多项人工智能功能&#xff0c;涵盖特效、调色、降噪等多个方面…

网络安全必修课:20个核心知识点大揭秘

1、什么是SQL注入攻击 概述 攻击者在 HTTP 请求中注入恶意的 SQL 代码&#xff0c;服务器使用参数构建数据库 SQL 命令时&#xff0c;恶意SQL 被一起构造&#xff0c;并在数据库中执行。 注入方法 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码 ‘ or ‘1’’…

XSS漏洞及其工具Beef使用

XSS(Cross Site Scripting,跨站脚本漏洞)漏洞&#xff0c;又叫 CSS 漏洞&#xff0c;是最常见的 Web 应用程序漏洞。其主要原理是当动态页面中插入的内容含有特殊字符(如<)时&#xff0c;用户浏览器会将其误认为是插入了HTML 标签&#xff0c;当这些HTML标签引入了一段 Java…

电脑文件msvcp100.dll丢失原因,如何快速修复msvcp100.dll

电脑文件msvcp100.dll丢失原因&#xff0c;最近有朋友在问这个&#xff0c;显然会问这个的人&#xff0c;一般都是遇到了msvcp100.dll丢失的问题了&#xff0c;今天我们就来详细的给大家说说msvcp100.dll这个文件吧&#xff0c;我们只有了解了msvcp100.dll这个文件&#xff0c;…

链表详解-leetcode203.移除链表元素

链表 移除链表元素 题目&#xff1a; 题意&#xff1a;删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[…

十九、软考-系统架构设计师笔记-真题解析-2021年真题

软考-系统架构设计师-2021年上午选择题真题 考试时间 8:30 ~ 11:00 150分钟 1.前趋图(Precedence Graph)是一个有向无环图&#xff0c;记为&#xff1a;→(Pi,Pj)Pi must Complete Before Pj may strat), 假设系统中进程P{P1, P2,P3,P4, P5, P6, P7, P8}&#xff0c; 且进程的…

AI交互数字人应用在教育领域有何作用?

AI数字人在教育领域中&#xff0c;除了可以承担个性化教学辅导、沉浸式数字课堂、虚拟仿真实训室中&#xff0c;还可以作为AI交互数字人提供情感陪伴和心理辅导。与真人心理老师相比&#xff0c;AI交互数字人更具高度隐私保密性&#xff0c;可以为学生提供精确及个性化的咨询服…

LlamaParse:RAG中高效解析复杂PDF的最佳选择

一、前言 在过去的一年中&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff09;模型在信息检索和自然语言处理领域取得了显著的进展&#xff0c;但同时也面临着一系列挑战。尤其是在处理复杂PDF文档时&#xff0c;RAG模型的局限性变得尤为明显。这些文档通常…

SpringBoot ---HTML转PDF工具

之前项目用的WKHtmlToPdf&#xff0c;速度较慢&#xff0c;现在需要改成基于ITEXT java使用itext7实现html转pdf_java使用itext7实现html转pdf全代码完整示例 cainiaobulan-CSDN博客文章浏览阅读2.7k次。使用itext7html转pdf_java使用itext7实现html转pdf全代码完整示例 caini…

美团2023年财报:全年营收2767亿元,即时配送订单219亿笔

3月22日&#xff0c;美团(股票代码:3690.HK)发布2023年第四季度及全年业绩。公司各项业务继续取得稳健增长&#xff0c;全年营收2767亿元(人民币&#xff0c;下同)&#xff0c;同比增长26%&#xff0c;经营利润134亿元。 本年度&#xff0c;美团继续围绕“零售科技”战略&…

openlayers 入门教程(四):layers 篇

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

广告增量实时索引构建实践

本期作者 1.前言 在广告检索系统中&#xff0c;增量索引&#xff08;实时索引&#xff09;是一类常见的技术&#xff0c;用于使广告信息的变更及时生效。其中一种主要的思路即由检索系统消费广告更新数据流&#xff0c;实时更新内存索引&#xff0c;对此行业中已有很多优秀方案…

OpenHarmony开发之图形UI组件解析

简介 图形UI组件实现了一套系统级的图形引擎。 该组件为应用开发提供UIKit接口&#xff0c;包括了动画、布局、图形转换、事件处理&#xff0c;以及丰富的UI组件。 组件内部直接调用HAL接口&#xff0c;或者使用WMS(Window Manager Service)提供的客户端与硬件交互&#xff…

数据结构之排序一

目录 1.排序 一.概念及其分类 二.排序的稳定性 2.插入排序 一.基本思想 二.插入排序的实现 复杂度 稳定性的分析 3.希尔排序 一.预排序代码的实现 二.希尔排序代码实现 复杂度分析 4.clock函数 1.排序 一.概念及其分类 说到排序&#xff0c;我们都不陌生&#x…

设计数据库之概念模式:E-R模型

Chapter3&#xff1a;设计数据库之概念模式&#xff1a;E-R模型 笔记来源&#xff1a;《漫画数据库》—科学出版社 设计数据库的步骤&#xff1a; 概念模式 概念模式(conceptual schema)是指将现实世界模型化的阶段进而&#xff0c;是确定数据库理论结构的阶段。 概念模式的设…

Ubuntu 安装 Carla仿真环境

1、系统要求 Ubuntu 16.04/18.04/20.04 CARLA 为 16.04 之前的 Ubuntu 版本提供支持。然而&#xff0c;Unreal Engine需要合适的编译器才能正常工作。 CARLA 服务器至少需要 6 GB GPU&#xff0c;但建议使用 8 GB。 2、安装NIVDIA驱动 BISO设置 开机F12&#xff0c;进入BIOS…

29-中断管理

中断管理 什么是中断管理&#xff1f; 用户可以自定义配置系统可管理的最高中断优先级的宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY&#xff08;高四位有效&#xff09;&#xff0c;它是用于配置内核中的basepri 寄存器的&#xff0c;当 basepri 设置为某个值的时候…

org.springframework.boot:type=Admin,name=SpringApplication异常

javax.management.InstanceNotFoundException: org.springframework.boot:typeAdmin,nameSpringApplication 问题描述&#xff1a; IDEA 新建 SpringBoot 项目&#xff0c;启动时后台报错&#xff1a; javax.management.InstanceNotFoundException: org.springframework.boot…

基于springboot的牙科就诊管理系统

技术&#xff1a;springbootmysqlvue 一、系统背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样…

粤嵌6818开发板如何理解Linux文件IO?

一、文件IO的概述 1、什么是文件&#xff1f; Linux下一切皆文件。普通文件、目录文件、管道文件、套接字文件、链接文件、字符设备文件、块设备文件。 2、什么是IO&#xff1f; input output&#xff1a;输入输出 3、什么是文件IO&#xff1f; 对文件的输入输出&#xff0c;把…