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

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

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

2.1 什么是深度优先算法

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


2.2 图的深度优先搜索

不同,图没有根节点,并且是可以回溯的,比如下图所示,为一个 11 节点的图搜索表示74528bf05141427f9265cc51dc6c6a45.png

其中:


节点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 是没有任何出度和邻接点的。

60ed9ad1aede4468b401ba5ba92e622d.png


2.4 邻接矩阵

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

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

比如,下图中:

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

23747b1c057243df9a0807dcb8582ff5.png


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

2.5.1 栈

图的深度优先遍历是靠来完成的,我们首先创建一个空栈

e240821cdbb14a6cb2642455b94afd59.png


2.5.2 Visited数组

d746bfae5ed24e43a14b71f9b384f84c.png

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


2.5.3 遍历序列

准备一个空的遍历序列,用来存放最终生成的访问元素。

32b06aa8f80d4d5995c3268431a431b5.png


2.5.4 遍历过程

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


第1步

节点0入栈

5e7f6c5cf5fa4b8593c2e313d4a092c7.png


第2步

节点0的第一个邻接点入栈

cea2607b8e504b88a187a4165b1e25e5.png


第3步

节点1的第一个邻接点节点2入栈

0693ab7f0d4f43bab54f8ed16ee7afc9.png


第4步

1519669ca6fe49ec8b0f06d92514098f.png


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

cba6f1e9427149c7b7f72b73f7e83585.png


第5步

节点6的第一个邻接点也是唯一一个邻接点:节点3入栈

baf5ff63715c4d83abe350f946877e70.png


第6步

节点3的第一个邻接点也是唯一一个邻接点:节点7入栈

bd96bd2248b642458c58b7aa8d7a2a21.png


第7步

节点7没有任何出度和邻接点,此时节点7出栈,回溯至节点3

f9b09bd7499345d59ea5a0056de921a2.png


第8步

节点3的唯一一个邻接点:节点7已经被访问,此时节点3的所有邻接节点均已访问,此时,节点3出栈,回溯至节点6

5f6432feea4c4c1e9b8292c8f8b4d0a1.png


第9步

同理,此时节点6的唯一一个邻接点:节点3已经被访问,此时节点6的所有邻接节点均已访问,此时,节点6出栈,回溯至节点2

a3ad2877ee1049b68717b692a72ec238.png


第10步

2925c5e4e51143c5b2f0ba3ce52478ed.png


此时节点2的三个邻接点:节点0、节点1、节点6均已被访问过,因此节点2出栈,回溯至节点1

455388725c5740d29d6efafc1f828d71.png


第11步

此时节点1的三个邻接点:节点2、节点4、节点5其中节点2已被访问,因此节点4入栈

fbddd1789e1c4eaab57af91bd8f97a8d.png


第12步

以此类推,节点4出栈 => 节点5入栈,并回溯至节点1节点1所有邻接点均已访问。节点1出栈,回溯至节点0

d2dd34e7da774a6d83a447ce553381d6.png


第13步

此时,节点0的所有出度邻接点均已访问,节点0出栈,此时为空栈

431a8aef0e1041eb9c00b8b58c7e9ce9.png


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

b3452b4bec364eabba491e1842e16d2b.png


2.6 树的深度优先搜索

9e5288facde24e2e8adc72170b5b2a2d.png


由上所述遍历过程,树的深度优先遍历序列如下图所示

237ebc1b4331422c968f2f57c05ae95e.png

相关文章
|
17天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
35 3
|
29天前
|
机器学习/深度学习 算法 机器人
多代理强化学习综述:原理、算法与挑战
多代理强化学习是强化学习的一个子领域,专注于研究在共享环境中共存的多个学习代理的行为。每个代理都受其个体奖励驱动,采取行动以推进自身利益;在某些环境中,这些利益可能与其他代理的利益相冲突,从而产生复杂的群体动态。
130 5
|
6天前
|
负载均衡 算法 应用服务中间件
5大负载均衡算法及原理,图解易懂!
本文详细介绍负载均衡的5大核心算法:轮询、加权轮询、随机、最少连接和源地址散列,帮助你深入理解分布式架构中的关键技术。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
5大负载均衡算法及原理,图解易懂!
|
12天前
|
算法 数据库 索引
HyperLogLog算法的原理是什么
【10月更文挑战第19天】HyperLogLog算法的原理是什么
15 1
|
18天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
52 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
|
1月前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
16天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
18天前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
21 0
|
18天前
|
算法 JavaScript 前端开发
垃圾回收算法的原理
【10月更文挑战第13天】垃圾回收算法的原理
20 0
|
22天前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。