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

相关文章
|
2天前
|
Arthas 监控 算法
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收算法评价标准、标记清除算法、复制算法、标记整理算法、分代垃圾回收算法等内容。
15 0
JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法
|
8天前
|
机器学习/深度学习 自然语言处理 算法
机器学习算法原理与应用:深入探索与实战
【5月更文挑战第2天】本文深入探讨机器学习算法原理,包括监督学习(如线性回归、SVM、神经网络)、非监督学习(聚类、PCA)和强化学习。通过案例展示了机器学习在图像识别(CNN)、自然语言处理(RNN/LSTM)和推荐系统(协同过滤)的应用。随着技术发展,机器学习正广泛影响各领域,但也带来隐私和算法偏见问题,需关注解决。
|
9天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】层次聚类算法的原理与应用
【4月更文挑战第30天】层次聚类是数据挖掘中的聚类技术,无需预设簇数量,能生成数据的层次结构。分为凝聚(自下而上)和分裂(自上而下)两类,常用凝聚层次聚类有最短/最长距离、群集平均和Ward方法。优点是自动确定簇数、提供层次结构,适合小到中型数据集;缺点是计算成本高、过程不可逆且对异常值敏感。在Python中可使用`scipy.cluster.hierarchy`进行实现。尽管有局限,层次聚类仍是各领域强大的分析工具。
|
9天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
|
10天前
|
机器学习/深度学习 算法 数据挖掘
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(下)
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(下)
|
10天前
|
机器学习/深度学习 算法 搜索推荐
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例(上)
【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例
|
12天前
|
机器学习/深度学习 数据采集 人工智能
【热门话题】AI作画算法原理解析
本文解析了AI作画算法的原理,介绍了基于机器学习和深度学习的CNNs及GANs在艺术创作中的应用。从数据预处理到模型训练、优化,再到风格迁移、图像合成等实际应用,阐述了AI如何生成艺术作品。同时,文章指出未来发展中面临的版权、伦理等问题,强调理解这些算法对于探索艺术新境地的重要性。
29 3
|
13天前
|
机器学习/深度学习 人工智能 算法
详解AI作画算法原理
AI作画算法运用深度学习和生成对抗网络(GAN),通过学习大量艺术作品,模拟艺术家风格。卷积神经网络(CNN)提取图像特征,GAN中的生成器和判别器通过对抗训练生成艺术图像。循环神经网络和注意力机制可提升作品质量。这种技术开创了艺术创作新途径。
|
15天前
|
算法 数据可视化
【视频】Copula算法原理和R语言股市收益率相依性可视化分析
【视频】Copula算法原理和R语言股市收益率相依性可视化分析
|
15天前
|
机器学习/深度学习 自然语言处理 算法
【视频】K近邻KNN算法原理与R语言结合新冠疫情对股票价格预测|数据分享(下)
【视频】K近邻KNN算法原理与R语言结合新冠疫情对股票价格预测|数据分享