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

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

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

2.1 图的广度优先搜索

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

6898774b3c5c40d4b2e5eb1f0ef0e939.png

其中:


节点0 :包含三个出度,分别指向其三个邻接点,分别为节点1、节点2、节点3,同时节点0也是节点2的邻接点。

节点1:包含三个邻接点,分别为节点2、节点4、节点5

节点2:邻接点为节点0、节点1、节点6。

节点3:邻接点为节点6、节点7。

节点4:邻接点为节点1。

节点5:邻接点为节点1、节点2、节点4、节点6。

节点6:邻接点为节点3。

节点7:邻接点为节点6


2.2 邻接表

下图为 2.1 中图搜索所示的邻接表形式。可以看到,节点7、节点8、节点10 是没有任何出度和邻接点的。

2f71ab443e324e9c9b48befd896a1a54.png


2.3 邻接矩阵

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

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


比如,下图中:

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

327f2777f8de41889fbfc0b0a78613fe.png


2.4 图的广度优先搜索遍历过程

2.4.1 队列

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

54817eeca8894f1886597ec822bcc46c.png


2.4.2 Visited数组

d746bfae5ed24e43a14b71f9b384f84c.png

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


2.4.3 遍历序列

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

32b06aa8f80d4d5995c3268431a431b5.png


2.4.4 遍历过程

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


第1步

8a0e252254ed4997b7fb88e3e9cc82e2.png


第2步

节点0出队列,并且节点0的所有邻接点入队列

a5f4f96e98a4454c91c1139b2b4d2808.png


第3步

节点1出队列,节点1的邻接点入队列,但是此时,节点1的邻接节点节点2已经被访问过了,因此节点5、节点4进队列

9acb5ceca8be4d0d820e036506ecb7d7.png


第4步

11aeab2b1fe448b98261e41ebd04c02a.png


节点2出队列,节点2有两个邻接节点,其中节点0已经被访问,因此,节点6如队列

7cf37715834e488995fd18ff704306eb.png


第5步

节点3出队列,节点3有两个邻接节点,其中节点6已经被访问,因此,节点7入队列

868830bb3f944090a2715aac2b086688.png


第6步

f2f39be0ba3842d2a82a00cd5e700cfd.png


节点5出队列,节点5有四个邻接节点均已被访问,此时无节点入队列。同理,节点6、节点7出队列,最终生成的遍历序列如下图所示

c24b6fe08b7a4de48744a76ecb74cc5c.png

相关文章
|
17天前
|
存储 机器学习/深度学习 算法
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
第十五届蓝桥杯pb组国赛E题[马与象] (15分)BFS算法 详解
18 3
|
5天前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
13 1
|
7天前
|
存储 传感器 算法
「AIGC算法」近邻算法原理详解
**K近邻(KNN)算法概述:** KNN是一种基于实例的分类算法,依赖于训练数据的相似性。算法选择最近的K个邻居来决定新样本的类别,K值、距离度量和特征归一化影响性能。适用于非线性数据,但计算复杂度高,适合小数据集。应用广泛,如推荐系统、医疗诊断和图像识别。通过scikit-learn库可实现分类,代码示例展示了数据生成、模型训练和决策边界的可视化。
「AIGC算法」近邻算法原理详解
|
15天前
|
自然语言处理 算法 搜索推荐
分词算法的基本原理及应用
分词算法的基本原理及应用
|
13天前
|
算法 PHP
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码
12 1
|
14天前
|
算法 安全 Java
Java中MD5加密算法的原理与实现详解
Java中MD5加密算法的原理与实现详解
|
5天前
|
算法 Python
决策树算法详细介绍原理和实现
决策树算法详细介绍原理和实现
|
5天前
|
存储 算法 Java
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
7 0
|
9天前
|
设计模式 JavaScript 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
vue2 原理【详解】MVVM、响应式、模板编译、虚拟节点 vDom、diff 算法
15 0