你认识哪几种树结构

news2025/1/13 13:38:17

二叉树,B,B+,B*,R树

二叉树

使用二分结构存储数据,查找数据时,耗时最好可达到O(log2N)。但是二叉树没有平衡的特性,所以在经过一系列的增删后,可能会出现极端的情况,耗时会接近O(N)。

注意,这里的耗时,不仅仅是指查询耗时,还有删除,增加,更新的耗时,因为在确定更新某个节点之前,需要先进行查找

B树

B树在二叉树的基础上增加了平衡的特性,使得树的查询效率维持在O(log2N),因为他能保持树的基本平衡。

保持树的基本平衡,就意味着同样有N个节点的树,B树比二叉树显得更矮,更胖,磁盘读取次数更少。磁盘读取耗时大概分为几个部分

  1. 定位柱面位置时间,大概在0.1s左右
  2. 等待时间,即磁头到达指定的柱面后,磁盘还需要旋转到指定的位置,一般磁盘转速在5400rpm,7200rpm左右,也就是一圈大约0.0083s
  3. 传输时间,读取到数据后,传输到内存的时间,一般传输一个字节在0.02us左右

可以看到,时间基本耗在了定位柱面的时间上,也就是根据数据指针进行定位的过程,所以我们需要通过合理高效的数据结构,减少第一阶段的次数,而树型结构目前就是效率很高的结构。特别是平衡树。这也就是为什么从磁盘读取的数据所有的存储结构一般用平衡树(一般为多叉,多叉比二叉能更加减少磁盘读写)

特性:

  1. 树中每个节点最多含有m个孩子(m>2)
  2. 除根节点和叶子节点外,其他每个节点至少有ceil(m/2)个孩子
  3. 除叶子节点外,其他节点包含关键字信息,指向关键字数据信息的指针信息以及指向子节点的指针信息
  4. 所有叶子节点都出现在同一层

因为根至少有两个孩子,因此第二层起码有两个子节点

假设内含节点最多有m个孩子,则第三层起码有2*ceil(m/2)个子节点

以此类推,第四层起码有2*ceil(m/2)*ceil(m/2)=2*ceil(m/2)^2=2*ceil(m/2)^(4-2)

以此类推,第l层起码有2*ceil(m/2)^(l-2)

B树的中每个节点存储的内容都是一样的,都包含

  1. 存储关键字信息(17表示一个磁盘文件的文件名)
  2. 存储关键字指向数据的指针信息(小红方块表示这个17文件内容在硬盘中的存储位置)
  3. 存储子节点的指针信息(p1表示指向17左子树的指针)
  4. 节点中存储的关键字数可以是几个到几千个,只要不超过磁盘块的大小即可(磁盘块一般为1K~4K左右)

磁盘存储为什么用B树而不用二叉树呢?一个是因为B树是多叉树,而是因为B树是平衡树。两者都是为了节省磁盘IO读写。之后B+树,B*树的优化目的其实也是为了优化磁盘读写来进行设计的,只是优化方式不同。

二叉树到B树

二叉------>多叉

不平衡------->平衡

B+树

B+树是B树的一种变种,所以他们都是平衡多叉树。

B+树通过优化非叶子节点存储的内容来提高单词磁盘IO读取到的关键字信息,从而减少磁盘IO,提高效率。

B+树的存储结构为

非叶子节点:

  1. 存储关键字信息(5表示一个磁盘文件的文件名)
  2. 存储子节点的指针信息(p1表示指向5左子树的指针)

叶子节点:

  1. 存储关键字信息(5表示一个磁盘文件的文件名)
  2. 存储关键字指向数据的指针信息
  3. 存储指向兄弟节点的指针

可以看到,对于非叶子节点,相对于B树存储三种信息,B+树只需要存储两种信息,单词读取磁盘获取的关键子信息就比B树要多,进而减少磁盘IO

同时B树与B+树的区别还在于,B+树中关键字是会重复的,比如根节点中关键字5,在左节点中也会有5出现,他们是属于一个关键字,并不是两个。而B树中的关键字是不会重复的。

原因:因为B+树的叶子节点要包含所有的关键字信息,才能做到只搜索叶子节点就可以做到全表扫描。

为什么MuSQL的索引存储结构用B+树而不用B树呢?

  1. 一个是因为B+树的非叶子节点能存储更多的关键字信息
  2. 一个是因为B+树的叶子节点存储指向兄弟节点的指针,使得对于范围查找会更容易
  3. 一个是因为叶子节点包含所有的关键字信息,只需要变量叶子节点就可以进行全表扫描。而不用像B树一样需要做中序遍历

知识点

中序遍历:

前序遍历:

后序遍历:

B*树

B*树是B+树的一种变种树。同样他也是平衡多叉树。

对于B+树,他跟B树一样,对子节点的个数有限制,少了需要合并,多了需要分裂

B/B+树特性:

  1. 树中每个节点最多含有m个孩子(m>2)
  2. 除根节点和叶子节点外,其他每个节点至少有ceil(m/2)个孩子

B*树特性:

  1. 树中每个节点最多含有m个孩子(m>2)
  2. 除根节点和叶子节点外,其他每个节点至少有ceil(2m/3)个孩子
  3. 当新加入节点是,如果兄弟节点未满,则加入到兄弟节点。如果兄弟节点已满,那么自己和兄弟节点各自拆分出1/3部分组成新节点
  4. 当删除节点时,如果子节点树少于ceil(2m/3),那么才会进行组合。

在B*树种,第一个特性不变,对于第二个特性,B*树将其提高到ceil((2m)/3),减少了分裂的概率,或者叫减少了分裂的频率。同时在分裂时,如果发现兄弟节点未满,那么会将新加入的节点分配到兄弟节点,如果兄弟节点已满,会将自己的1/3和兄弟节点的1/3分割出来,组成一个新节点。前者无疑也减少了节点的拆分,至于子节点树少于一定数量后进行合并过程,其目的也是通过提高合并门槛,降低了合并的概率(频率)。

无论是新增还是删除节点,其目的都是为了提升节点的空间利用率,降低拆分合并概率,也就是降低磁盘IO的次数。

另一方面,B*树的非叶子节点还包含了指向兄弟节点的指针

R树

后补

红黑树

后补

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1411470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用Python实现中文文本关键词抽取的三种方法

文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四种:基于TF-IDF的关键词抽取、基于TextRank的关键词抽取、…

代理模式-C#实现

该实例基于WPF实现,直接上代码,下面为三层架构的代码。 目录 一 Model 二 View 三 ViewModel 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练…

像搭乐高一样把模型拼在一起

琳琅满目的乐高积木,通过一块又一块的叠加,可以创造出各种栩栩如生的人物、景观等,不同的乐高作品相互组合,又能为爱好者带来新的创意。 我们把思路打开一点,在大模型(LLM)爆发的当下&#xff0…

SpringBlade微服务开发平台

采用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI)后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:BladeToolBladeTool已推送至…

Nginx部署、Jenkins自动发布、搜索服务概述、ES部署与使用、消息队列概述、RabbitMQ部署及使用

案例1:HIS前端代码测试 Fontend主机部署Nginx #HIS前端代码为编译后代码,可直接部署在nginx上查看效果[rootFontend ~]# yum clean all; yum repolist -vTotal packages: 8,265[rootFontend ~]# yum -y install nginx.x86_64 #安装nginx…

第13章_泛型(集合中使用泛型,比较器中使用泛型,自定义泛型结构,泛型在继承上的体现,通配符的使用)

文章目录 第13章_泛型(Generic)本章专题与脉络1. 泛型概述1.1 生活中的例子1.2 泛型的引入 2. 使用泛型举例2.1 集合中使用泛型2.1.1 举例2.1.2 练习 2.2 比较器中使用泛型2.2.1 举例2.2.2 练习 2.3 相关使用说明 3. 自定义泛型结构3.1 泛型的基础说明3.2 自定义泛型类或泛型接…

[git] windows系统安装git教程和配置

一、何为Git Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 二、git安装包 有2种版本,Git for Windows Setup和Git for Windows Portable(便携版)两个版本都可以。 三、Git for Windows Por…

【GPU】深入理解GPU硬件架构及运行机制

深入理解GPU硬件架构及运行机制 作者:Tim在路上​ 曾看到有一篇名为《The evolution of a GPU: from gaming to computing》的文章。 这篇文章非常热烈的讨论了这些年GPU的进步,这引发了我们的一些思考: 为什么我们总说GPU比CPU要强大,既然…

ISCTF2023 RE FloweyRSA WP

64位无壳,但是进去连main函数都没有 这里应该是main的头部 这里是一个jmp的花指令 jnz short labela 跳转到labela是一段没用的代码 所以把它和labela全部NOP 往下翻,又是必然跳转至label1 把jz short label1到db 0的花指令全部NOP label3这里也是类似的…

【mongoDB】下载与安装教程

目录 1. 下载 2.安装 3.启动 mangoDB是否启动成功 ? 1. 下载 官网地址:https://www.mongodb.com/try/download/community 2.安装 3.启动 在此输入命令操作数据库 mangoDB是否启动成功 ? 在浏览器访问:http://127.0.0.1:27017/ 出现该页面表示m…

jQuery之ajax发送请求(table数据)

一般后端给我们的数据是这样的 比如下面是所有学员信息 访问网址:http://localhost:8080/student/all 前端,我们需要通过点击查询所有学员信息即可显示到下面列表中, 给查询全部学员按钮设置点击事件,点击就发送请求 $("…

Python模块与包:扩展功能、提高效率的利器

文章目录 一、引言1.1 模块与包对于Python开发的重要性1.2 Python作为拥有丰富生态系统的编程语言 二、为什么学习模块与包2.1 复用代码:利用现有模块与包加速开发过程2.2 扩展功能:通过模块与包提供的功能增强应用的能力 三、模块的使用3.1 导入模块&am…

OPENMV驱动云台实现颜色追踪

前言 本篇文章旨在记录我电赛期间学习OPENMV对颜色识别,以及通过串口通信的方式将坐标数据传给单片机,从而驱动舵机云台进行颜色追踪。 一、OPENMV色块识别追踪代码 # Single Color RGB565 Blob Tracking Example # # This example shows off single co…

防御保护---防火墙(安全策略、NAT策略实验)

防御保护---防火墙(安全策略、NAT策略实验) 1.实验需求2.实验说明及思路3.实验配置3.1 配置IP地址以及VLAN3.2 配置防火墙IP地址及划分区域3.3 配置防火墙安全策略3.4 配置防火墙NAT策略 1.实验需求 1.生产区在工作时间内可以访问服务器区,仅…

RabbitMQ 笔记一

概览: MQ基本概念 RabbitMQ入门 基本工作模 1.MQ是什么? MQ:Message Queue, 存储消息的中间件,是消息发送过程中的暂存容器,主要用于解决分布式系统进程间的通信。 分布式系统通信的两种方式:直接远程调用、借助第三…

npm,cnpm install报:Error: certificate has expired at TLSSocket.onConnectSecure

问题描述 最近发现前端项目 CI/CD 时失败,报下面的错误。npm淘宝镜像源证书过期导致的。 [npminstall:get] retry GET https://registry.npm.taobao.org/vue-router after 400ms, retry left 1, error: ResponseError: certificate has expired, GET https://reg…

TS学习笔记十:装饰器及三斜线指令

本节介绍TS中的装饰器和三斜线指令, 装饰器(Decorators)为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。   三斜线指令是包含单个XML标签的单行注释。 注释的内容会做为编译器指令使用。 讲解视频 20240116-205052装饰器…

CQ 社区版 2.8.0 | 支持TiDB、StarRocks,新增列过滤算法、导出模式设置等

Hello,CloudQuery 社区版 2.8.0 已发布,本文将带大家详细解析本次更新的功能~(完整的讲解视频可点击 👉🏻 CloudQuery 社区版2.8.0 功能讲解演示 本期亮点更新 新增支持数据源 TiDB、StarRocks数据保护新增列过滤脱敏…

【iOS ARKit】人脸检测追踪基础

在计算机人工智能(Artificial Inteligence,AI)物体检测识别领域,最先研究的是人脸检测识别,目前技术发展最成熟的也是人脸检测识别。人脸检测识别已经广泛应用于安防、机场、车站、闸机、人流控制、安全支付等众多社会领域&#x…

[C#]winform部署yolov7+CRNN实现车牌颜色识别车牌号检测识别

【官方框架地址】 https://github.com/WongKinYiu/yolov7.git 【框架介绍】 Yolov7是一种目标检测算法,全称You Only Look Once version 7。它是继Yolov3和Yolov4之后的又一重要成果,是目标检测领域的一个重要里程碑。 Yolov7在算法结构上继承了其前…