首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

深度DFS 和 广度BFS搜索算法学习

编程知识
2024年09月26日 15:26

目录


图的两种遍历方式:

  1. 深度优先遍历(DFS——Depth First Search)
  2. 广度优先遍历(BFS——Breath First Search)

图的遍历算法里,处理临时数据,依赖两个抽象数据结构:

  • 队列

广度优先的动态图

广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。

深度优先的动态图

从根结点出发,一直向左子节点走,直到左子节点不存在然后返回到上一个节点走这个节点的右子节点,然后一直往右子节点走,同样的也是走不通为止就返回。很显然这种一路走到黑,黑了就回头的方式,就是深度优先遍历的过程。


广度和深度的具体步骤

广度搜索中,存储下层的数据需要用到队列,
深度搜索中,存储一整条路径的数据,需要用到栈 ,用栈去回溯到最开始的顶点,
具体步骤去看《秒懂算法:用常识解读数据结构》,我觉得书分解得很详细了,不需要在搬一次了。

深度和广度的应用场景

我面试过挺多次的,很多面试问题都慢慢淡忘了,但是有一个问题一直记得:
他问,你平时在做爬虫的时候,用深度还是广度?

现在回想起来,觉得他问得真扯淡。

为什么?

选择深度或广度所对应的是不同场景,理论上来说,所有问题,都可以用list解决,但是为什么还要分化出那么多的数据结构?

还不是因为——不同的问题,采用不同的数据结构,这样解决效率才高,资源才省。

比如看这个下面这个家族结构图:
image

如果想要找到曾祖母Ruby的所有儿女,那么用深度还是广度?

  • 肯定是广度最合适。
    使用广度优先搜索,那么立刻就能找到她所有直接女儿(Andrea、Xander、CoCo和Maya),不用搜索和她相隔一代的亲人。

如果想要找到Ruby的一个叫Ruth的后代,用深度还是广度?

  • 显然是深度合适。
    用深度优先搜索,则可以马上移动到图的底部,在几步之内就能找到曾孙一辈。
    虽然还是需要遍历整幅图才能找到Ruth,但至少快速找到她是有可能的。而用广度优先搜索则别无选择,必须遍历前两辈的所有人,才能开始搜索曾孙这一辈。

在思考用深度还是广度时?应该是先思考究竟是想先尽可能在初始顶点附近搜索还是想先尽可能远离它

  • 前者适合用广度优先搜索
  • 后者适合用深度优先搜索。

所以,为什么我现在觉得那个问得很扯淡,就类似,小明,你开发喜欢用list还是Map呀?
- -。

From:https://www.cnblogs.com/mysticbinary/p/18112532
本文地址: http://www.shuzixingkong.net/article/2326
0评论
提交 加载更多评论
其他文章 前端使用 Konva 实现可视化设计器(23)- 绘制曲线、属性面板
本章分享一下如何使用 Konva 绘制基础图形:曲线,以及属性面板的基本实现思路,希望大家继续关注和支持哈(多求 5 个 Stars 谢谢)!
前端使用 Konva 实现可视化设计器(23)- 绘制曲线、属性面板 前端使用 Konva 实现可视化设计器(23)- 绘制曲线、属性面板 前端使用 Konva 实现可视化设计器(23)- 绘制曲线、属性面板
C# WebSocket Servers -- Fleck、SuperSocket、TouchSocke
最近在维护老项目,感觉内存一直都有问题,定位到问题是WebSocketServer的问题,了解了 Fleck、SuperSocket、TouchSocke 等开源项目 ,这里记录一下。可能今后都不会用些轮子了,.net5、.net6、.net7、.net8 项目已经集成了WebSocket,只要 a
C语言数据类型、变量的输入和输出、进制转换
scanf标准函数可以从键盘得到数字并记录到存储区里,为了使用这个标准函数需要包含stdio.h这个头文件 在scanf函数调用语句里应该使用存储区的地址表示存储区;双引号里使用占位符表示存储区的类型, 在scanf函数调用语句里尽量不要写不是占位符的内容,如果用户输入的格式和程序要求的格式不同 程
博客园终身会员小福利,送华为云服务器
最近我们和华为云总经销商浙江杭云网络科技有限公司达成了合作,准备从10月开始做一些华为云的代理业务,增加园子的收入来源。 在做这个业务之前,先给园子的终身会员送点华为云服务器作为小福利,这次只申请到100台,先到先得,送完为止。 赠送的云服务器配置如下: 终身VIP会员 :送1核2G1M华为云服务器
博客园终身会员小福利,送华为云服务器
华为GaussDB数据库(单机版)在ARM环境下的安装指南
一、软件版本 机器配置:8核16G,CPU: Huawei Kunpeng 920 2.9GHz 操作系统:EulerOS 2.8 64bit with ARM 数据库版本:GaussDB Kernel 505.1.0 build 44f4fa53 二、部署流程 2.1 新建用户 ① 以omm用户为
华为GaussDB数据库(单机版)在ARM环境下的安装指南 华为GaussDB数据库(单机版)在ARM环境下的安装指南 华为GaussDB数据库(单机版)在ARM环境下的安装指南
VulnStack-红日靶机二
红日靶机二 环境搭建 只需要把虚拟机的 host-only(仅主机)网卡改为 10.10.10.0 网段,如下配置 把 NAT 网卡,改为 192.168.96.0 网段,如下 首先恢复到 v1.3 快照 让后点击放弃,放弃后再开机,用其他用户 .\de1ay:1qaz@WSX 凭证登陆,密码过期修
VulnStack-红日靶机二 VulnStack-红日靶机二 VulnStack-红日靶机二
手把手教你建【货币】一题的网络流模型
现在已知如下问题,并告诉你这题可以用网络流来解决,你该怎么做,该怎么建出网络流的模型? 一些前提: 显然可以发现绝不可能走横向向左的边,但可能走竖向向上的边(如下图) 那么图其实就是这样的:问从 \(s\) 到 \(t\) 的最小花费 如果没有那 \(m\) 条限制,我们直接跑最短路就行了,加上这些
手把手教你建【货币】一题的网络流模型 手把手教你建【货币】一题的网络流模型 手把手教你建【货币】一题的网络流模型
三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)
三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...) @目录三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)1. 条件构造器介绍2. 准备工作:3. 等值查询3.1 eq (条件筛选属性 = ?)3.
三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...) 三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...) 三,MyBatis-Plus 的各种查询的“超详细说明”,比如(等值查询,范围查询,模糊查询...)