惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
MyScale Blog
MyScale Blog
博客园_首页
G
Google Developers Blog
博客园 - 【当耐特】
美团技术团队
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Vercel News
Vercel News
小众软件
小众软件
博客园 - 司徒正美
雷峰网
雷峰网
T
Tailwind CSS Blog
V
V2EX
博客园 - 三生石上(FineUI控件)
F
Fortinet All Blogs
罗磊的独立博客
量子位
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog

博客园 - Eagle6970

ASP.NET Core实现MCP Streamable HTTP 豆包生成C#微博API HTTP调用实例代码 豆包生成C#即梦API HTTP调用实例代码 SQL Server - sp_spaceused 子网掩码和IP地址范围 [VS Code] Run JavaScript [VS Code] Copy所有包含关键字的行 [数据结构学习笔记25] 归并排序(Merge Sort) [VS Code] 使用dotnet CLI安装和管理NuGet包 [数据结构学习笔记24] 选择排序(Selection Sort) [数据结构学习笔记23] 插入排序(Insertion Sort) [数据结构学习笔记22] 冒泡排序(Bubblesort) [数据结构学习笔记21] 快速排序(Quicksort) [数据结构学习笔记19] 二叉树遍历(Binary Tree Traversal) [数据结构学习笔记18] 二分查找(Binary Search) [数据结构学习笔记17] 线性查找(Linear Search) [数据结构学习笔记16] 汉诺塔(Towers of Hanoi) [数据结构学习笔记15] 斐波那契数列(Fibonacci) [数据结构学习笔记14] 递归简介(Recursion)
[数据结构学习笔记20] 深度优先搜索(DFS)和广度优先搜索(B...
Eagle6970 · 2025-02-05 · via 博客园 - Eagle6970

深度优先搜索(DFS)和广度优先搜索(BFS)

这个思路和我们之前的二叉树的遍历类似。

以这个图为例:这是个无向图,有环。

                       B

                   |

                  A    -----   D   -------   F

                   |             |    |             |

                    C   ---   E    G           H

同样,两个步骤:

1. 节点被发现,这个是说该节点被发现存在;

2. 节点被访问过,这个是说该节点被检查了,并且是否有子节点需要遍历。

先看深度优先搜索(DFS),从A开始,一直往下,直到终点,然后开始回溯。

explored = []; discovered = [A]

A有三个相邻节点

explored = [A]; discovered = [B,C,D]

然后我们explore B,与B相邻的只有A,A已经在explored里,所以B explore完毕

explored = [A,B]; discovered = [C,D]

然后开始explore C,与C相邻的有A,E,A已经在explored里,把E放入discovered,C explore完毕

explored = [A,B,C]; discovered = [E,D] // 注意这里我们把E放在前面,这保证我们后面优先explore E

接着开始Explore E,D、C相邻,C已经explored,D to be explored,E explore完毕

explored = [A,B,C,E]; discovered = [D]

explore D,F、G相邻新节点

explored = [A,B,C,E,D]; discovered = [F,G]

explored = [A,B,C,E,D,F]; discovered = [H,G]

explored = [A,B,C,E,D,F,H]; discovered = [G]

explored = [A,B,C,E,D,F,H,G]; discovered = []

顺序为:A,B,C,E,D,F,H,G。

广度优先搜索(BFS),从A开始,一次explore相邻节点,然后到下一层。

explored = []; discovered = [A]

explored = [A]; discovered = [B,C,D]

explored = [A,B]; discovered = [C,D]

explored = [A,B,C]; discovered = [D,E]

explored = [A,B,C,D]; discovered = [E,F,G]

explored = [A,B,C,D,E]; discovered = [F,G]

expored = [A,B,C,D,E,F]; discovered = [G,H]

expored = [A,B,C,D,E,F,G]; discovered = [H]

expored = [A,B,C,D,E,F,G,H]; discovered = []

顺序为:A,B,C,D,E,F,G,H。

代码暂略。

性能分析

DFS:

时间复杂度:最坏情况,所有节点和边都遍历到,O(|N| + |E|),N是节点数;E是边数

空间复杂度:最坏情况,图有很长的path,O(|N|)

BFS:

时间复杂度:最坏情况,所有节点和边都遍历到,O(|N| + |E|)

空间复杂度:最坏情况,O(|N|)

两种都是线性复杂度。