[数据结构学习笔记20] 深度优先搜索(DFS)和广度优先搜索(BFS)

news/2025/2/5 20:57:34/文章来源:https://www.cnblogs.com/Eagle6970/p/18682347

深度优先搜索(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|)

两种都是线性复杂度。

 

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

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

相关文章

口胡赛 2025.2.5

T1 首先不要 \(p\) 这个肯定是不能枚举 \(p\) 再直白处理的,因为最快的 Floyd 都要 \(O(n^3)\) 这样。 那么不要 \(p\) 的信息是合并得来的,但是直接合并复杂度也不够,考虑使用经典分治,先加入 \([l,mid]\) 然后递归 \((mid,r]\),撤销 \([l,mid]\),加入 \((mid,r]\),在递…

linux系统语言修改

查看当前系统语言查看已有的语言包修改linux系统语言 指令: gvim /etc/locale.conf 将“ ”的内容替换即可:

基于ESP32的桌面小屏幕实战[7]:第一个工程Hello world!以及打印日志

摘要 本文构建下载了示例工程hello world,并在其中调用esp_log.h中的日志函数打印日志。 1. 创建工程 打开esp目录,把hello world文件夹复制到当前文件夹,并打开hello world文件夹。 cd ~/esp cp -r esp-idf/examples/get-started/hello_world . cd ~/esp/hello_world使用命…

基于Python的Selenium详细教程

本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术:Python、HTML、CSS、JavaScript一、PyCharm安装配置Selenium本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0需要你懂的技术:Python、HTML、CSS、Java…

作业01

public class HomeWork01 {public static void main(String[] args) {int n1 = 13;int n2 = 17;int n3 = n1+n2;System.out.println("n3 = "+ n3);//30int n4 = 38;int n5 = n4-n3;System.out.println("n5 ="+n5);//8}}

CROS错误,xhr类型

解决方案:向Web.config里添加此项设置即可

2025省选模拟9

不知道啥2025省选模拟9 网络流专场是吧😅 Delov 的 npy 们 原题链接 一眼网络流,然后不会了。 发现正常顺着限制做做不了,考虑将限制转化一下,以 L 操作为例。 在 \(a_i\) 左侧的点中不超过 \(b_i\) 个,等价于从左往右数第 \(b_i+1\) 个点在 \(a_i\) 右侧。 但还是不好做…

海外社交媒体运营卡成狗?云手机一键“救场”

海外社交媒体运营卡成狗?云手机一键“救场” 在海外社交媒体运营中,运营人员往往会遇到各种挑战,导致运营效率低下,甚至感觉“卡成狗”。而云手机作为一种流行的成熟普及技术工具,可以为海外社交媒体运营带来一定的帮助,实现一键“救场”。以下是对云手机在海外社交媒体运…

MyBatis resultmap结果映射

创建数据库和实体类 首先创建数据库student和teacher,并且每个学生对应一个老师,一个老师可以对应多个学生,数据库如下图: 创建实体类Student1 package com.loubin.pojo;2 3 public class Student {4 private int id;5 private String name;6 7 Teacher teach…

Linguistics-English-Textbooks: 上海外教社: 高校英语专业系列教材(修订版)

新世纪高校英语专业系列教材(修订版) https://we.sflep.com/books/newcenturymajor1.aspx教材特色 配套资源 特点 秉以新《国标》指导下的英语专业课程改革为导向精心架构,体系完备。 凝聚海内外英语专业教育界专家学者智慧,教材编写高屋建瓴、深入 浅出. 兼顾语言基本技能…

OCRmyPDF: 让图片 PDF 可复制、搜索的神器

翻开十年前的工作报告,面对泛黄的纸质合同,整理成摞的文献资料 - 这些场景总离不开扫描仪,将纸张材料转成 PDF 扫描件电子版。 但生成的 PDF 文件像一张张定格照片,既不能复制文字,也无法搜索关键词。 图片 今天推荐的开源项目:OCRmyPDF 专治各种"哑巴PDF"。它…