网站开发用盗版犯法上海网站建设要多少钱

张小明 2026/1/11 9:34:50
网站开发用盗版犯法,上海网站建设要多少钱,wordpress 课程预定 插件,建筑网校排行榜广度优先搜索#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进行投诉反馈,一经查实,立即删除!

宁波最好的seo外包深圳网站建设优化

利用AWK进行日志数据处理与分析 1. 从Web日志中展示数据 之前已经了解了如何使用AWK查看Apache Web服务器的日志文件,现在将使用内容更丰富多样的演示文件进行操作。 2. 按日期筛选条目 在掌握了如何显示日期后,接下来看看如何仅打印某一天的条目。可以使用AWK中的匹配运…

张小明 2026/1/11 5:52:22 网站建设

计算机网站建设的能力旅游网站开发的需求

Qwen3-VL在线客服升级:用户上传截图后自动定位问题 在今天的数字服务场景中,用户遇到问题时最常做的动作是什么?不是打字描述,而是——截个图发过去。 这背后反映了一个长期存在的痛点:人们更习惯用视觉方式表达困惑…

张小明 2026/1/9 12:55:17 网站建设

珍爱网建设网站的目的wordpress 获取总页数

智能投资者风险偏好动态评估系统关键词:智能投资者、风险偏好、动态评估系统、机器学习、金融科技摘要:本文围绕智能投资者风险偏好动态评估系统展开深入探讨。该系统旨在通过对投资者多维度数据的分析,实时、准确地评估投资者的风险偏好&…

张小明 2026/1/8 3:02:44 网站建设

兰州网站设计制作wang域名 网站

深岩银河存档编辑器终极指南:5步快速自定义游戏体验 【免费下载链接】DRG-Save-Editor Rock and stone! 项目地址: https://gitcode.com/gh_mirrors/dr/DRG-Save-Editor 深岩银河存档编辑器是一款专为《Deep Rock Galactic》玩家设计的开源工具,能…

张小明 2026/1/9 6:27:00 网站建设

一个网站怎么做多条线路移动端网站搭建

Qwen3-VL-8B-Instruct:多模态AI如何重构企业视觉智能新范式 【免费下载链接】Qwen3-VL-8B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-VL-8B-Instruct 在数字化转型的浪潮中,企业正面临前所未有的视觉数据处理挑战。传统…

张小明 2026/1/8 22:39:31 网站建设

网站建设网上消费算在年费惠阳区建设局网站

如何科学选定LED显示屏尺寸?从原理到实战的完整选型指南你有没有遇到过这样的情况:花大价钱装了一块巨幕LED屏,结果走近一看全是“马赛克”;或者屏幕明明很大,但播放视频时总觉得画面被拉伸、文字看不清?问…

张小明 2026/1/8 23:30:07 网站建设