ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)(二)

本文为:ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)第二篇

深度优先算法(DFS)和广度优先算法(BFS):DFS 和 BFS 在 ES 中的应用(一)
深度优先算法(DFS)和广度优先算法(BFS):深度优先搜索算法(二)
深度优先算法(DFS)和广度优先算法(BFS):广度优先搜索算法(三)

2、深度优先搜索(Depth-First Search)

2.1 什么是深度优先算法

一句话导读:当你玩迷宫游戏的时候,你进入迷宫那一刻,右手摸着墙手不离开,不停前进,直至走出迷宫,此时你使用的就是深度优先搜索。

2.2 图的深度优先搜索

不同,图没有根节点,并且是可以回溯的,比如下图所示,为一个 11 节点的图搜索表示
在这里插入图片描述

其中:

  • 节点0 :包含三个出度,分别指向其三个邻接点,分别为节点1、节点2、节点3,同时节点0也是节点2的邻接点。
  • 节点1:包含三个邻接点,分别为节点2、节点4、节点5
  • 节点2:邻接点为节点0、节点1、节点6
  • 节点3:邻接点为节点6、节点7
  • 节点4:邻接点为节点1
  • 节点5:邻接点为节点1、节点6
  • 节点6:邻接点为节点3
  • 节点7:没有任何邻接点,因为节点7的出度并没有指向任何节点。或者说其没有任何出度
  • 节点8:和节点7一样,没有任何邻接点
  • 节点9:邻接点为节点8
  • 节点10:和节点7一样,没有任何邻接点。

2.3 邻接表

下图为 2.2 中图搜索所示的邻接表形式。可以看到,节点7、节点8、节点10 是没有任何出度和邻接点的。
在这里插入图片描述

2.4 邻接矩阵

下图为 2.2 中图搜索所示邻接矩阵表示

其中,纵坐标表示 出度节点,横坐标表示 邻接点

比如,下图中:

  • 节点0:邻接点为节点1、节点2、节点3
  • 节点3:邻接点为节点6、节点7

在这里插入图片描述

2.5 图的深度优先搜索遍历过程

2.5.1 栈

图的深度优先遍历是靠来完成的,我们首先创建一个空栈
在这里插入图片描述

2.5.2 Visited数组

在这里插入图片描述

我们借助 Visited数组,来标识当前节点 n 是否被访问过,空值代表 false.

2.5.3 遍历序列

准备一个空的遍历序列,用来存放最终生成的访问元素。
在这里插入图片描述

2.5.4 遍历过程

首先,图是没有根节点的,我们可以以任何节点作为其起始节点,下面我就以节点0为起始节点为例,演示一下图的深度搜索过程。

第1步
节点0入栈
在这里插入图片描述

第2步
节点0的第一个邻接点入栈
在这里插入图片描述

第3步
节点1的第一个邻接点节点2入栈
在这里插入图片描述

第4步

在这里插入图片描述

节点2的第一个邻接点节点0入栈,但是节点0 visited = true,即已经被访问过,因此顺延节点1,同样节点1也被访问过,因此继续顺延值节点6,节点6入栈并标记访问
在这里插入图片描述

第5步
节点6的第一个邻接点也是唯一一个邻接点:节点3入栈
在这里插入图片描述

第6步
节点3的第一个邻接点也是唯一一个邻接点:节点7入栈
在这里插入图片描述

第7步
节点7没有任何出度和邻接点,此时节点7出栈,回溯至节点3
在这里插入图片描述

第8步
节点3的唯一一个邻接点:节点7已经被访问,此时节点3的所有邻接节点均已访问,此时,节点3出栈,回溯至节点6
在这里插入图片描述

第9步
同理,此时节点6的唯一一个邻接点:节点3已经被访问,此时节点6的所有邻接节点均已访问,此时,节点6出栈,回溯至节点2
在这里插入图片描述

第10步
在这里插入图片描述

此时节点2的三个邻接点:节点0、节点1、节点6均已被访问过,因此节点2出栈,回溯至节点1
在这里插入图片描述

第11步
此时节点1的三个邻接点:节点2、节点4、节点5其中节点2已被访问,因此节点4入栈
在这里插入图片描述

第12步
以此类推,节点4出栈 => 节点5入栈,并回溯至节点1节点1所有邻接点均已访问。节点1出栈,回溯至节点0
在这里插入图片描述

第13步
**此时,节点0的所有出度邻接点均已访问,节点0出栈,此时为空栈
在这里插入图片描述

第14步
此时,节点8入栈,节点8所有邻接点均已访问,节点8出栈,而后,节点9入栈,而后马上出栈。以此类推,最后,节点10入栈,而后而后马上出栈,生成最终序列,如下图所示**
在这里插入图片描述

2.6 树的深度优先搜索

在这里插入图片描述

由上所述遍历过程,树的深度优先遍历序列如下图所示
在这里插入图片描述

2.7 动画演示

DFS视频演示

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elastic开源社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值