当前位置: 首页 > news >正文

探究MySQL中的“树”结构

1 引言

树高千丈,叶落求索 – 唐代杜牧

树结构在MySQL中常用于表示层次关系,如组织结构或分类体系。引入树结构可使数据之间建立父子关系,便于查询和管理。益处包括快速检索子节点、方便展示层次关系、支持递归查询等。

2 基础概念

2.1 名词解析

程序就像是一张有向图,你需要跟着边走才能找到正确的路径。

  • 节点(Node):图中的基本元素,通常用来表示实体或对象。在计算机科学中,节点可以是任何数据结构中的元素,如树中的节点或图中的顶点。
  • 边(Edge):节点之间的连接关系,用来表示节点之间的关联或连接。在图论中,边可以是有向的(箭头表示方向)或无向的(双向连接)。
  • 路径(Paths):在图论中,路径是图中节点的序列,其中相邻节点通过边相连。路径可以是简单路径(不经过重复节点)或环路(起点和终点相同的路径)。
  • 循环(Cycles):循环是图中形成闭合回路的路径,即起点和终点相同的路径。循环可以是简单循环(不经过重复节点,除起点和终点外)或包含重复节点的循环。
  • 稀疏度(Sparsity):是指图中边的数量与可能存在的最大边数之间的比率。在稀疏图中,边的数量相对较少,而在稠密图中,边的数量相对较多。这个概念通常用于描述图的结构和连接性。
  • 图遍历(Traversing graphs): 图遍历是一种算法,用于访问图中的所有节点或特定节点,以便对图进行分析或搜索。常见的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。DFS沿着图的深度遍历节点,而BFS则逐层遍历节点。这些算法在解决许多图相关问题时非常有用,如寻找路径、检测环路、拓扑排序等。
  • 树(Trees):树是一种层次性的数据结构,由节点(顶点)和边组成,其中每个节点最多有一个父节点,但可以有多个子节点。树的一个节点称为根节点,它没有父节点。树中除了根节点外,每个节点都有且仅有一个父节点。树的节点之间通过边连接,形成层次结构,从根节点到任意节点都有唯一的路径。树常用于表示层次关系,如组织结构、文件系统等。树的一些重要概念包括深度(节点到根节点的距离)、高度(树的最大深度)、叶节点(没有子节点的节点)等。树还有许多变种,如二叉树(每个节点最多有两个子节点)、二叉搜索树(左子节点小于父节点,右子节点大于父节点)等,它们在不同场景下有不同的应用和特性。
  • 欧拉路径(Euler Paths):欧拉路径是指在图论中,经过图中每条边恰好一次的路径。如果一个图包含欧拉路径,则称该图具有欧拉路径性质。欧拉路径可以从一个节点出发,经过每条边一次且仅一次,最终回到另一个节点,或者以某个节点结束而不回到起点。欧拉路径在解决一些图相关问题时非常有用,如在网络中找到一条包含所有边的路径,或者在游戏中找到一条经过所有关键点的路径。欧拉路径的存在性和性质受到图的结构和边的连接方式的影响,因此对于不同类型的图,欧拉路径的判断和寻找方法也会有所不同。

2.2 图的模型设计

在计算机传统上,表达图的结构关系可以使用边缘列表、邻接表或邻接矩阵其中之一来体现。

边缘列表

  • 概念:边缘列表是一种简单的图表示方法,其中每条边都列为一对顶点。
  • 优点:
    易于实现和理解。
    对于边较少的稀疏图效率高。
  • 缺点:
    对于边较多的稠密图效率低。
    查找与顶点相邻的所有边可能较慢。

邻接表

  • 概念:邻接表是一种数据结构,用于表示图,其中每个顶点维护其相邻顶点的列表。
  • 优点:
    对于边较少的稀疏图效率高。
    对于稀疏图,比邻接矩阵占用更少内存。
  • 缺点:
    对于某些操作,如检查两个顶点之间是否有边,速度较慢。
    对于边较多的稠密图,需要更多内存。

邻接矩阵

  • 概念:邻接矩阵是一个二维数组,其中两个顶点之间存在边的情况用1表示。
  • 优点:
    对于边较多的稠密图效率高。
    允许快速查找边。
  • 缺点:
    对于边较少的稀疏图效率低。
    对于稀疏图,比邻接表占用更多内存。

3 基础模型

3.1 图内容

在这里插入图片描述

3.2 表结构和数据

创建表结构并且初始化数据:

CREATE TABLE nodes ( 
nodeID CHAR ( 1 ) PRIMARY KEY 
);CREATE TABLE edges(childID CHAR(1) NOT NULL,parentID CHAR(1) NOT NULL,PRIMARY KEY(childID, parentID)
);INSERT INTO nodes VALUES ('A'), ('B'), ('C'), ('D'), ('E'), ('F');
INSERT INTO edges VALUES ('A','C'), ('C','D'), ('C','F'),('B','E');

查询数据:

SELECT * FROM edges;

在这里插入图片描述

3.3 宽度优先搜索

3.3.1 编写存储过程

定义存储过程,如下:

DROP  PROCEDURE  IF  EXISTS ListReached;
DELIMITER go
CREATE PROCEDURE ListReached (IN root CHAR(1))
BEGINDECLARE rows1  SMALLINT  DEFAULT  0;DROP TABLE  IF EXISTS reached;CREATE TABLE  reached (nodeID  CHAR(1) PRIMARY KEY) ENGINE= HEAP;INSERT INTO reached VALUES ( root );SET rows1 = ROW_COUNT();WHILE rows1 > 0 DOINSERT IGNORE INTO reached  SELECT DISTINCT  childID FROM edges AS e INNER JOIN reached AS p ON  e.parentID = p.nodeID;SET rows1 = ROW_COUNT();INSERT IGNORE INTO reached  SELECT DISTINCT  parentID FROM edges AS e INNER JOIN reached AS p ON  e.childID = p.nodeID; SET rows1 = rows1 +  ROW_COUNT();END WHILE;SELECT *  FROM reached;DROP TABLE reached; END;
go DELIMITER;

调用存储过程:

call  ListReached( 'A');

在这里插入图片描述

3.3.2 使用CTEs

从A 开始搜索:

WITH RECURSIVE cte AS (SELECTchildID,parentID,1 AS LEVELFROMedgesWHEREchildId = 'A' UNION ALLSELECTt.childID,t.parentID,c.LEVEL + 1FROMedges t

相关文章:

  • 【TensorFlow深度学习】卷积层变种与深度残差网络原理
  • Java——二进制原码、反码和补码
  • xmake+xrepo自建仓库添加交叉编译工具链
  • 『大模型笔记』FlashAttention: 具有IO意识的快速且内存高效的精确注意力机制!
  • C++17新特性
  • bootstrapblazor小白笔记
  • 面试题--this关键字
  • 网络编程(三)
  • JVM类加载过程
  • linux进程加载和启动过程分析
  • 解决git status提示error bad signature 0x00000000
  • 步进电机和伺服电机哪个好_步进电机和伺服电机的区别
  • 一文了解知识中台:是什么、作用、如何搭建
  • 探索UWB模块的多功能应用——UWB技术赋能智慧生活
  • C语言习题~day27
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【翻译】babel对TC39装饰器草案的实现
  • HTTP--网络协议分层,http历史(二)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • mysql 5.6 原生Online DDL解析
  • Object.assign方法不能实现深复制
  • php ci框架整合银盛支付
  • Redux系列x:源码分析
  • Sublime Text 2/3 绑定Eclipse快捷键
  • windows-nginx-https-本地配置
  • 关于springcloud Gateway中的限流
  • 扑朔迷离的属性和特性【彻底弄清】
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 项目实战-Api的解决方案
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • ​插件化DPI在商用WIFI中的价值
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # centos7下FFmpeg环境部署记录
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #Linux(make工具和makefile文件以及makefile语法)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (1)无线电失控保护(二)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (2022 CVPR) Unbiased Teacher v2
  • (8)STL算法之替换
  • (arch)linux 转换文件编码格式
  • (C语言)逆序输出字符串
  • (Java数据结构)ArrayList
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (python)数据结构---字典
  • (二)WCF的Binding模型
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)程序员疫苗:代码注入
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ******IT公司面试题汇总+优秀技术博客汇总