百度站长平台h5网站安康哪里做网站

张小明 2026/1/12 21:17:52
百度站长平台h5网站,安康哪里做网站,室内设计整套方案图,网站建设 東道网络广度优先搜索#xff08;BFS#xff09;详解及C实现 一、什么是广度优先搜索#xff08;BFS#xff09;#xff1f; 广度优先搜索#xff08;Breadth-First Search#xff0c;简称BFS#xff09;是一种用于遍历或搜索树或图的经典算法。其核心思想与DFS的“深度优先”截…广度优先搜索BFS详解及C实现一、什么是广度优先搜索BFS广度优先搜索Breadth-First Search简称BFS是一种用于遍历或搜索树或图的经典算法。其核心思想与DFS的“深度优先”截然不同而是尽可能广地遍历当前节点的所有邻接节点先遍历完当前层级的所有节点后再依次遍历下一层级的节点直到所有节点都被访问完毕。同样用迷宫比喻理解BFS走进迷宫后遇到岔路时不急于深入某一条路而是先探索当前位置周围所有能直接到达的岔路节点当前层级探索完这些节点后再分别深入每个岔路节点探索它们周围未被访问的节点下一层级以此类推直到找到出口或遍历完整个迷宫。BFS的实现必须依赖**队列Queue**这种“先进先出FIFO”的数据结构。队列的特性恰好能保证“先访问当前层级节点再访问下一层级节点”的顺序将当前节点的邻接节点依次入队待当前节点处理完毕后再从队列头部取出下一个节点继续处理循环往复直至队列为空。二、BFS的核心特性与适用场景1. 核心特性逐层遍历优先遍历当前节点的所有邻接节点同层级再遍历下一层级节点呈现“辐射式”扩散效果队列依赖通过队列维护待访问节点保证遍历顺序的“先进先出”无需回溯与DFS核心差异空间复杂度取决于队列的最大容量最坏情况下为O(n)n为节点数如完全二叉树的最后一层节点数接近n/2时间复杂度与DFS一致遍历图时为O(VE)V为顶点数E为边数遍历树时为O(n)树中边数为n-1。2. 适用场景图的遍历连通分量查找、最短路径求解尤其是无权图的最短路径树的遍历层序遍历即按层级从上到下、从左到右访问节点迷宫问题求解从起点到终点的最短路径DFS无法保证最短BFS是最优选择拓扑排序处理有向无环图DAG的节点依赖关系如任务调度、课程安排多源最短路径问题如多个起点到所有节点的最短距离。三、BFS的C实现队列核心BFS的核心实现逻辑固定均围绕“队列访问标记”展开步骤如下初始化队列将起始节点入队并标记为已访问当队列不为空时取出队头节点访问该节点遍历当前节点的所有邻接节点若邻接节点未被访问则标记为已访问并加入队列重复步骤2-3直到队列为空遍历完成。下面以「无向图的遍历」「二叉树的层序遍历」「无权图最短路径求解」为例讲解BFS的具体实现。案例1无向图的BFS遍历使用与DFS案例相同的无向图结构0 → 1 → 20 → 3 → 4采用邻接表存储图通过队列实现BFS遍历。#includeiostream#includevector#includequeueusingnamespacestd;// 邻接表存储图vectorvectorintadj;// 标记节点是否被访问vectorboolvisited;// BFS实现函数voidbfs(intstart){// 初始化队列queueintq;// 起始节点入队标记为已访问q.push(start);visited[start]true;while(!q.empty()){// 取出队头节点intuq.front();q.pop();// 访问当前节点打印节点值coutu ;// 遍历当前节点的所有邻接节点for(intv:adj[u]){// 未访问的邻接节点标记后入队if(!visited[v]){visited[v]true;q.push(v);}}}}intmain(){// 图的节点数intn5;// 初始化邻接表和访问标记数组adj.resize(n);visited.resize(n,false);// 构建无向图与DFS案例一致adj[0].push_back(1);adj[1].push_back(0);adj[1].push_back(2);adj[2].push_back(1);adj[0].push_back(3);adj[3].push_back(0);adj[3].push_back(4);adj[4].push_back(3);coutBFS遍历结果;// 从节点0开始遍历若图不连通需遍历所有未访问节点bfs(0);coutendl;return0;}输出结果BFS遍历结果0 1 3 2 4说明BFS按“层级”遍历先访问起始节点0第0层再访问0的所有邻接节点1、3第1层最后访问1的邻接节点2、3的邻接节点4第2层完美体现“逐层扩散”的特性。案例2二叉树的层序遍历BFS二叉树的层序遍历是BFS的典型应用要求按“从上到下、从左到右”的顺序访问每个节点与BFS的“逐层遍历”逻辑完全契合。#includeiostream#includequeueusingnamespacestd;// 二叉树节点定义structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};// BFS实现层序遍历voidlevelOrderBFS(TreeNode*root){// 边界条件树为空if(rootnullptr){return;}// 初始化队列根节点入队queueTreeNode*q;q.push(root);while(!q.empty()){// 取出队头节点TreeNode*nodeq.front();q.pop();// 访问当前节点coutnode-val ;// 左子节点非空则入队保证左到右的顺序if(node-left!nullptr){q.push(node-left);}// 右子节点非空则入队if(node-right!nullptr){q.push(node-right);}}}intmain(){// 构建与DFS案例相同的二叉树// 1// \ // 2// /// 3TreeNode*rootnewTreeNode(1);root-rightnewTreeNode(2);root-right-leftnewTreeNode(3);cout二叉树层序遍历BFS;levelOrderBFS(root);coutendl;// 释放内存deleteroot-right-left;deleteroot-right;deleteroot;return0;}输出结果二叉树层序遍历BFS1 2 3说明按层级访问先访问根节点1第0层再访问第1层的2最后访问第2层的3符合层序遍历的要求。若需要区分“每一层的节点”如换行打印每层可在循环内记录当前队列大小即当前层的节点数遍历完该数量的节点后换行具体优化代码可参考后续补充。案例3无权图的最短路径求解BFS的核心优势之一是能高效求解无权图的最短路径这里的“最短”指路径上的边数最少。原理是BFS的逐层遍历特性第一次访问到目标节点时经过的层级数就是最短路径长度。我们通过一个简单的无向图求解从节点0到节点4的最短路径。#includeiostream#includevector#includequeueusingnamespacestd;vectorvectorintadj;vectorboolvisited;// 记录每个节点到起始节点的最短距离vectorintdistance;// BFS求解最短路径从start到所有节点voidbfsShortestPath(intstart){queueintq;q.push(start);visited[start]true;distance[start]0;// 起始节点到自身距离为0while(!q.empty()){intuq.front();q.pop();for(intv:adj[u]){if(!visited[v]){visited[v]true;// 邻接节点的距离 当前节点距离 1distance[v]distance[u]1;q.push(v);// 若找到目标节点可直接提前退出可选if(v4){return;}}}}}intmain(){intn5;adj.resize(n);visited.resize(n,false);distance.resize(n,-1);// 初始化距离为-1未访问// 构建无向图同前序案例adj[0].push_back(1);adj[1].push_back(0);adj[1].push_back(2);adj[2].push_back(1);adj[0].push_back(3);adj[3].push_back(0);adj[3].push_back(4);adj[4].push_back(3);intstart0,target4;bfsShortestPath(start);cout从节点start到节点target的最短路径长度distance[target]endl;return0;}输出结果从节点0到节点4的最短路径长度2说明节点0到4的路径为0→3→4共2条边因此最短路径长度为2。BFS第一次访问到4时就确定了最短路径无需后续遍历效率极高。若使用DFS需要遍历所有可能路径后才能确定最短因此无权图最短路径优先选择BFS。四、BFS的进阶优化分层遍历区分每层节点在二叉树层序遍历或图的层级遍历中有时需要明确区分“每一层的节点”如换行打印每层节点。核心优化思路是在每次循环开始时记录当前队列的大小即当前层的节点总数然后只遍历该数量的节点遍历完后即完成当前层的处理可执行换行等操作。#includeiostream#includequeueusingnamespacestd;structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),right(nullptr){}};// 分层打印二叉树BFS进阶voidlevelOrderWithLayer(TreeNode*root){if(rootnullptr){return;}queueTreeNode*q;q.push(root);while(!q.empty()){// 记录当前层的节点数intlayerSizeq.size();// 遍历当前层的所有节点for(inti0;ilayerSize;i){TreeNode*nodeq.front();q.pop();coutnode-val ;if(node-left!nullptr){q.push(node-left);}if(node-right!nullptr){q.push(node-right);}}// 遍历完当前层换行coutendl;}}intmain(){// 构建一棵更复杂的二叉树// 1// / \ // 2 3// / \ \ // 4 5 6TreeNode*rootnewTreeNode(1);root-leftnewTreeNode(2);root-rightnewTreeNode(3);root-left-leftnewTreeNode(4);root-left-rightnewTreeNode(5);root-right-rightnewTreeNode(6);cout二叉树分层遍历BFSendl;levelOrderWithLayer(root);// 释放内存简化处理deleteroot-left-left;deleteroot-left-right;deleteroot-left;deleteroot-right-right;deleteroot-right;deleteroot;return0;}输出结果二叉树分层遍历BFS12 34 5 6说明通过记录每层节点数成功区分了每一层的节点并换行打印这种优化在解决“二叉树的层平均值”“二叉树的最大宽度”等问题时非常实用。五、BFS的常见注意事项访问标记时机必须在节点入队时标记为已访问而非出队时。若出队时标记可能导致同一节点被多次入队尤其图中有环时引发重复处理和效率问题队列的正确使用严格遵循“入队-标记-出队-访问-邻接节点入队”的流程确保队列只存储未访问的节点无向图与有向图的差异有向图的BFS只需遍历“出边”对应的邻接节点无需考虑反向边其他逻辑与无向图一致多连通分量处理若图不连通需遍历所有节点对每个未访问的节点调用BFS如for(int i0; in; i) if(!visited[i]) bfs(i);最短路径的适用范围BFS的最短路径求解仅适用于无权图或边权相等的图。若图为带权图边权不相等需使用Dijkstra算法等。六、BFS与DFS的核心差异对比为了更清晰地区分两种算法这里整理了核心差异对比表对比维度BFSDFS核心思想逐层遍历辐射式扩散深度优先回溯探索数据结构依赖队列先进先出栈/递归调用栈先进后出遍历顺序按层级顺序先广后深按分支顺序先深后广典型应用无权图最短路径、层序遍历、拓扑排序连通分量查找、排列组合、回溯问题N皇后、数独空间复杂度取决于队列最大容量O(n)取决于递归深度/栈大小O(n)是否保证最短路径是无权图/边权相等图否七、总结BFS是一种基于“逐层遍历、队列驱动”的搜索算法核心优势在于能高效求解无权图的最短路径和实现分层遍历。其代码逻辑固定易于掌握关键是理解队列的“先进先出”特性与BFS“逐层扩散”思想的契合度。在C实现中只需围绕“队列初始化-节点入队标记-出队访问-邻接节点入队”的核心流程就能应对大多数图和树的遍历问题。需要注意访问标记的时机和多连通分量的处理避免出现重复访问或遗漏节点的问题。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

互易中国如何做网站公共服务标准化指南

3步搞定现代化WPF导航:NavigationView控件完全指南 【免费下载链接】wpfui WPF UI在您熟悉和喜爱的WPF框架中提供了流畅的体验。直观的设计、主题、导航和新的沉浸式控件。所有这些都是本地化且毫不费力的。 项目地址: https://gitcode.com/GitHub_Trending/wp/wp…

张小明 2026/1/7 3:21:35 网站建设

江苏优化网站公司wordpress单本小说站

Ubuntu 下的 C/C++ 编程工具与 Mono 使用指南 1. C/C++ 基础与 Ubuntu 工具概述 Linux 内核大多用 C 语言编写,这使得 Linux 能适配众多不同的 CPU。C++ 是 C 语言的面向对象扩展,C++ 编译器能正确编译 C 程序,但 C 编译器无法编译 C++ 代码。在 Ubuntu 系统中,为 C/C++ …

张小明 2026/1/7 3:21:30 网站建设

注册网站怎么注册不了腾讯云 wordpress教程视频

严格基于指定文件(核心为《01智慧城市一网统管平台-系统总体架构及其功能要点-20251018修订.docx》,简称《01总体架构》),结合《03系统数据库表》《05数据中枢》等,聚焦后台支撑10技术底座的“部署规范”与“协同逻辑”…

张小明 2026/1/11 21:05:04 网站建设

国外服装定制网站重庆地推团队外包

CCS规范中的重定时与静态数据解析 1. 重定时规则概述 在图像传感器系统中,重定时规则起着关键作用。 grouped_parameter_hold 可用于将 “重定时” 参数分组。相关 “重定时” 参数列表可参考特定的CCI寄存器映射。图像传感器需支持 grouped_parameter_hold 与 “重定时…

张小明 2026/1/7 4:01:33 网站建设

文化局网站建设方案网站关键字怎么优化

如何快速搭建多平台直播监控系统:3步实现实时数据抓取 【免费下载链接】live-room-watcher 📺 可抓取直播间 弹幕, 礼物, 点赞, 原始流地址等 项目地址: https://gitcode.com/gh_mirrors/li/live-room-watcher 还在为直播数据统计而烦恼吗&#x…

张小明 2026/1/9 23:55:04 网站建设