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

相关文章
|
6月前
|
算法 Python
深度优先算法
深度优先算法
|
3月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
135 12
|
5月前
|
存储 传感器 算法
「AIGC算法」近邻算法原理详解
**K近邻(KNN)算法概述:** KNN是一种基于实例的分类算法,依赖于训练数据的相似性。算法选择最近的K个邻居来决定新样本的类别,K值、距离度量和特征归一化影响性能。适用于非线性数据,但计算复杂度高,适合小数据集。应用广泛,如推荐系统、医疗诊断和图像识别。通过scikit-learn库可实现分类,代码示例展示了数据生成、模型训练和决策边界的可视化。
45 0
「AIGC算法」近邻算法原理详解
|
5月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
79 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
6月前
|
算法 Python
广度优先算法
广度优先算法
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
7月前
|
存储 算法
图的深度优先算法
图的深度优先算法
48 0
|
17天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
3天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。