广度优先搜索(BFS) vs 深度优先搜索(DFS):算法对比与 C++ 实现

目录

一、BFS 和 DFS 的核心思想

1. BFS(广度优先搜索)

2. DFS(深度优先搜索)

二、BFS 和 DFS 的对比

三、C++ 代码实现

1. BFS 实现(邻接表表示的无向图)

2. DFS 实现(递归与迭代两种方式)

四、关键细节说明

1. BFS 的关键点

2. DFS 的关键点

五、应用场景对比

六、总结


一、BFS 和 DFS 的核心思想

1. BFS(广度优先搜索)

  • 核心思想:按“层级”逐层遍历,先访问离起点最近的节点,再逐步向外扩散。

  • 类比:类似水波扩散,一层一层向外推进。

  • 数据结构:队列(FIFO)。

  • 适用场景:最短路径(未加权图)、社交网络层级关系、迷宫最短路径。

2. DFS(深度优先搜索)

  • 核心思想:沿着一条路径尽可能深入,直到无法继续时回溯,尝试其他分支。

  • 类比:走迷宫时,遇到岔路选择一条路走到头,再返回选择其他路。

  • 数据结构:栈(LIFO)或递归调用栈。

  • 适用场景:拓扑排序、连通性检测、回溯问题(如八皇后)、图的环路检测。


二、BFS 和 DFS 的对比

特性BFSDFS
遍历顺序层级遍历(近到远)深度优先(一条路走到黑)
数据结构队列(先进先出)栈(后进先出)或递归
空间复杂度O(N)(最坏情况,如完全二叉树)O(H)(H为树的高度,平衡树时为 O(logN))
时间复杂度O(N + E)(N为节点数,E为边数)同左
最短路径天然支持(未加权图)需额外处理(如记录路径长度)
内存消耗较高(存储每一层节点)较低(仅存储当前路径)
实现复杂度简单(固定队列操作)递归简单,迭代需显式栈

三、C++ 代码实现

1. BFS 实现(邻接表表示的无向图)

#include <iostream>
#include <queue>
#include <vector>
using namespace std;void bfs(const vector<vector<int>>& graph, int start) {vector<bool> visited(graph.size(), false);queue<int> q;q.push(start);visited[start] = true;while (!q.empty()) {int node = q.front();q.pop();cout << node << " "; // 访问节点// 遍历当前节点的所有邻居for (int neighbor : graph[node]) {if (!visited[neighbor]) {visited[neighbor] = true;q.push(neighbor);}}}
}// 示例图结构
vector<vector<int>> graph = {{1, 2},     // 节点0的邻居{0, 3, 4},  // 节点1的邻居{0, 5, 6},  // 节点2的邻居{1},        // 节点3的邻居{1},        // 节点4的邻居{2},        // 节点5的邻居{2}         // 节点6的邻居
};int main() {cout << "BFS遍历结果: ";bfs(graph, 0); // 输出: 0 1 2 3 4 5 6return 0;
}

2. DFS 实现(递归与迭代两种方式)

// 递归实现
void dfsRecursive(const vector<vector<int>>& graph, int node, vector<bool>& visited) {visited[node] = true;cout << node << " "; // 访问节点for (int neighbor : graph[node]) {if (!visited[neighbor]) {dfsRecursive(graph, neighbor, visited);}}
}// 迭代实现(显式栈)
void dfsIterative(const vector<vector<int>>& graph, int start) {vector<bool> visited(graph.size(), false);stack<int> s;s.push(start);visited[start] = true;while (!s.empty()) {int node = s.top();s.pop();cout << node << " ";// 反向遍历邻居以保证与递归顺序一致for (auto it = graph[node].rbegin(); it != graph[node].rend(); ++it) {if (!visited[*it]) {visited[*it] = true;s.push(*it);}}}
}int main() {cout << "DFS递归遍历结果: ";vector<bool> visited(graph.size(), false);dfsRecursive(graph, 0, visited); // 输出: 0 1 3 4 2 5 6cout << "\nDFS迭代遍历结果: ";dfsIterative(graph, 0);          // 输出: 0 1 3 4 2 5 6return 0;
}

四、关键细节说明

1. BFS 的关键点

  • 队列操作:每次从队头取出节点,并将未访问的邻居加入队尾。

  • 最短路径:BFS 首次访问到目标节点时,路径一定是最短的(适用于未加权图)。

  • 空间复杂度:最坏情况下需存储所有节点(如完全二叉树最后一层)。

2. DFS 的关键点

  • 递归与栈:递归隐式使用系统栈,迭代显式使用栈。

  • 遍历顺序:迭代实现中,若按正序访问邻居,结果可能与递归顺序不同(需反向遍历邻居)。

  • 应用场景:适合探索所有可能性(如回溯问题),但可能陷入深层分支无法及时返回。


五、应用场景对比

问题类型推荐算法原因
未加权图最短路径BFS天然支持最短路径
图的连通性检测DFS/BFS二者均可快速遍历所有连通节点
拓扑排序DFS天然支持后序遍历的逆序
迷宫所有路径DFS回溯特性适合探索所有可能路径
社交网络层级关系分析BFS按层遍历符合实际场景
检测环路DFS通过回溯标记路径,容易检测重复访问

六、总结

  • BFS 适合“广度优先”问题,如最短路径;DFS 适合“深度优先”问题,如回溯和连通性。

  • 代码实现:BFS 用队列,DFS 用栈或递归,注意遍历顺序和空间消耗。

  • 选择依据:根据问题特性(如是否需要最短路径、内存限制)选择算法。

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

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

相关文章

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…

操作系统的特征

并发 指两个或多个事件在同一时间间隔内发生。这些时间宏观上是同时发生的&#xff0c;但微观上是交替发生的。 并行 指两个或多个事件在同一时刻同时发生 操作系统的并发性 指计算机系统重“同时”运行着多个程序&#xff0c;这些程序宏观上看是同时运行的&#xff0c;而…

数据结构——B树、B+树、哈夫曼树

目录 一、B树概念1.B树的构造2 .B树的特点 二、B树概念1.B树构造2.B树的特点 三、B树和B树的区别四、哈夫曼树1.哈夫曼树的基本概念2.哈夫曼树的构建 一、B树概念 B树的出现是为了弥合不同的存储级别之间的访问速度上的巨大差异&#xff0c;实现高效的 I/O。平衡二叉树的查找效…

电子签的法律效力、业务合规与监管难点

撰稿 | 区长 来源 | 贝多财经 据2025年央视“3.15”晚会报道&#xff0c;借贷宝、人人信等平台上存在高利贷的情形。放贷人与借款人在平台签署借款合同&#xff0c;但是实际借款金额低于合同金额&#xff0c;从而绕开平台对利率的限制。这引发了人们对电子签法律效力、业务合…

资金管理策略思路

详细描述了完整交易策略的实现细节&#xff0c;主要包括输入参数、变量定义、趋势判断、入场与出场条件、止损与止盈设置等多个方面。 输入参数&#xff08;Input&#xff09;&#xff1a; EntryFrL (.6)&#xff1a;多头入场的前一日波动范围的倍数。 EntryFrS (.3)&#xff1…

体育直播视频源格式解析:M3U8 vs FLV

在体育直播领域&#xff0c;视频源的格式选择直接影响着直播的流畅度、画质以及兼容性。目前&#xff0c;M3U8 和 FLV 是两种最为常见的视频流格式&#xff0c;它们各有优劣&#xff0c;适用于不同的场景。本文将从技术原理、优缺点以及应用场景等方面对 M3U8 和 FLV 进行详细解…

【动态规划】下降路径最小和

跟之前不同由于可能取到最右上角值&#xff0c;则左右各加一列&#xff0c;并且由于求最小值&#xff0c;则加的列须设置为正无穷大&#xff1b; class Solution { public:int minFallingPathSum(vector<vector<int>>& matrix) {int nmatrix.size();vector<…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…

VScode

由于centos停止了维护 ,后面使用ubuntu 在Ubuntu中用vscode 充当记事本的作用 替代了centos中vim的作用 后面使用vscode编辑 vscode中继续使用makefile , xshell中的cgdb进行debug (半图形写 ,半命令行debug&&运行) 官网下载地址&#xff1a;https://code.visuals…

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…

异步编程与流水线架构:从理论到高并发

目录 一、异步编程核心机制解析 1.1 同步与异步的本质区别 1.1.1 控制流模型 1.1.2 资源利用对比 1.2 阻塞与非阻塞的技术实现 1.2.1 阻塞I/O模型 1.2.2 非阻塞I/O模型 1.3 异步编程关键技术 1.3.1 事件循环机制 1.3.2 Future/Promise模式 1.3.3 协程&#xff08;Cor…

python-selenium 爬虫 由易到难

本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动&#xff08;不容易遇到版本或者兼容性的问题&#xff09; 驱动下载网址&#xff1a;链接: link 1、实战1 &#xff08;1&#xff09;安装 selenium 库 pip install selenium&#…

前端OOM内存泄漏如何排查?

前言 现代前端开发中&#xff0c;随着应用的复杂性和交互性的增加&#xff0c;OOM&#xff08;Out Of Memory&#xff0c;内存不足&#xff09;问题和内存泄漏逐渐成为影响用户体验和应用性能的关键挑战。排查和解决这些问题需要开发人员具备良好的调试技巧和优化策略。 造成…

C++20:玩转 string 的 starts_with 和 ends_with

文章目录 一、背景与动机二、string::starts_with 和 string::ends_with&#xff08;一&#xff09;语法与功能&#xff08;二&#xff09;使用示例1\. 判断字符串开头2\. 判断字符串结尾 &#xff08;三&#xff09;优势 三、string_view::starts_with 和 string_view::ends_w…

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…

【MySQL】日志

目录 基本概念错误日志二进制日志查询日记慢查询日志 基本概念 日志&#xff08;Log&#xff09;是系统、软件或设备在运行过程中对发生的事件、操作或状态变化所做的记录。这些记录通常包含时间戳、事件类型、相关数据等信息&#xff0c;用于跟踪运行过程、排查故障、审计操作…

ArkUI-List组件

列表是一个复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;使得列表内容超出其范围的时候&#xff0c;就会自动变为可以滚动。列表适合用来展现同类数据类型。 List组件支持使用&#xff0c;条件渲染&#xff0c;循环渲染&#xff0c;懒加载等渲染控制方式生成子组件…

Word限定仅搜索中文或英文引号

在Word中&#xff0c;按下CtrlF键&#xff0c;左侧会弹出导航搜索栏&#xff1b; 点击放大镜旁边的下拉栏&#xff0c;选择高级查找 在查找内容处输入英文状态下的"&#xff0c;然后选择更多->使用通配符&#xff0c;就可以仅查找英文状态下的" 同理&#xff…

智能飞鸟监测 守护高压线安全

飞鸟检测新纪元&#xff1a;视觉分析技术的革新应用 在现代化社会中&#xff0c;飞鸟检测成为了多个领域不可忽视的重要环节。无论是高压线下的安全监测、工厂内的生产秩序维护&#xff0c;还是农业区的作物保护&#xff0c;飞鸟检测都扮演着至关重要的角色。传统的人工检测方…

React初学分享 事件绑定 组价通信 useState useEffect

React初学 React介绍快速搭建React项目JSXJSX的本质优势&#xff1a;JSX中使用JS表达式JSX中的列表渲染JSX实现简单条件渲染JSX实现复杂条件渲染 React中的事件绑定React基础事件绑定传递自定义参数同时传递事件对象和自定义参数 React中的组件useState修改状态的规则状态不可变…