算法之美:二叉树演进之多叉树及B-Tree树原理

        在上篇文章我们了解了平衡二叉树的优势,了解到平衡二叉树能够对不平衡的节点施加旋转,使得树达趋于平衡,以提升查询效率,操作效率很高,与之同时也存在着不少的问题,例如我们在实际使用中会通常会将树加载到内存中,如果节点少的话倒没有什么问题,但节点一多,例如上百万的节点,则高度很大,这时候进行一次IO操作就会出现性能问题。

        关于此问题我们详细展开,平衡二叉树每个节点只存储一个键值和数据的,每个磁盘块仅仅存储一个键值和数据。如果要存储海量的数据(如1000w),那构建平衡二叉树的时候耗时就会多,其平衡二叉树的节点也会非常的多,高度也会极其高,查找数据时会进行很多次的磁盘IO(高度=IO次数),效率将会极低。为了解决这个问题,接下来我们来讲解多叉树,其数据结构就是一种单个节点可以存储多个键值和数据的平衡树。

多叉树

        又称“多路查找树(muitl-way search tree) ”,每一个节点的子树可以多余两个,且每个节点处可以存储多个元素,常见的就是B树、B+树等。多叉树通过重新组织节点,降低了树的高度,显著提高了IO效率。

此处的B是Balanced的意思,不是Binary的意思

 

         操作系统IO操作都会利用磁盘预读原理,如果一个节点大小是一个存储页(4kb),存储每个节点只需要一次IO即可完成存储。B树在存储系统里面广泛被使用,例如数据库系统和文件系统等。

B树

        也叫 B-Tree,B-树,全称是 Balanced Tree,是一种多路平衡查找树。一个节点包括多个key (数量看业务),具有M阶的B树,每个节点最多有M-1个Key。节点的key元素个数就是指这个节点能够存储几个数据。每个节点最多有m个子节点,最少有M/2个子节点,其中M>2。

每个节点拥有最多的子节点,子节点的个数一般称为阶。

阶:m阶是代表每个节点最多有m个分支(子树)

        数据集合分布在整个树里面,叶子节点和非叶子节点都存储数据;类似在整个树里面做一次二分查找。B 树相对于平衡二叉树,每个节点存储了更多的键值(key)和数据(data)。实际业务中B树的阶数一般大于100,存储大量数据,B树高度也会很低,查询效率会更高, 

树的度:这棵树里面节点最大的度,节点的度:当前节点有几个孩子

 如下图为例:M阶B树,M=3,每个节点最多有M-1个Key,每个节点最多有M个节点,树的度=3

 动画效果演示:B-Tree Visualization

 应用场景

1)在数据库中,B树用来维护索引,用来提高查询效率,一个节点可以存储整个页(即磁盘块);
2)在文件系统中,B树用来存储文件的目录信息,提高文件的访问效率;
3)在操作系统中,B树可以用来存储内存管理信息,提高内存的分配效率;

举一反三

        3层的B树,阶数为1024,最多容纳多少个元素?

答:B树的阶数表示每个结点最多可以有多少个子结点,因此B树的阶数为1024,表示每个结点最多可以有1024个子结点。由于B树的3层,因此根结点可以有1024个子结点,每个子结点又可以有1024个子结点,因此一个3层的B树,阶数为1024,B树的每一层的节点数都是阶数的幂次方。 

计算总容量:把每一层的节点数相加 即1024^1+1024^2+1024^3 大约是 11亿个节点,假如每个节点放一个元素就是11亿个,所以在10亿个数据中找目标值,常规小于3次磁盘IO即可找到目标值,比平衡二叉树的30次提升了不少,平衡二叉树的高度就等于每次查询数据时磁盘 IO 操作的次数。

10亿的数据量,log2(N)约等于30次磁盘IO,log2(N) 相当于2的多少次方(立方)等于N,例:log2 (8)= 3,2的30次方=1073741824,所以就是30次磁盘IO。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RiPro主题-子主题huzao-child美化包v4.0带更新,附下载插件

压缩包里包含子主题下载插件演示数据 V4.0更新内容如下 1、左下角会员推广广告悬浮集成到后台 2、底部悬浮登录增加是否登录判断 3、在线申请友链页面美化 4、手机端底部版权信息被遮挡优化 5、部分bug修复及细节优化 源码下载 RiPro主题-子主题huzao-child美化包v4.0带…

Matlab|基于隐式Zbus高斯法的三相不平衡潮流计算【可设定变压器数量和位置】【Yy、Yd两种绕组方式】

目录 主要内容 部分代码 结果一览 主要内容 该模型基于隐式高斯法实现对配电网的三相不平衡潮流计算,通过选项可实现【不含变压器】和【含变压器】两种方式下的潮流计算,并且通过参数设置可实现多个变压器接入,该程序可计算【IE…

SSH连接SFTP传输:如何使用libssh库在Linux环境下进行(文件、文件夹)传输到远端服务器

建立SSH会话并连接远端服务器SSH身份验证密码验证密钥验证生成密钥查看密钥拷贝密钥验证密钥是否正确 SFTP子系统构建传输普通文件递归传输文件夹完整传输小demo 建立SSH会话并连接远端服务器 target_host:远端主机IPtarget_username:远端主机用户名 s…

Echarts之x轴,Y轴配置项大全

ECharts是一个强大的数据可视化库,提供了丰富的配置项来定制图表的x轴和y轴。下面是ECharts中x轴和y轴的配置项大全: xAxis配置项: type:轴类型,可选值有:“value”(数值轴), “cat…

生产调度问题分类——机器视角

获取更多资讯,赶快关注上面的公众号吧! 文章目录 单机调度并行机调度流水车间调度作业车间调度柔性作业车间开放车间总结 生产调度问题是实际工作中广泛存在的运筹学问题,可以描述为“给定若干加工任务,根据已有的生产条件&#…

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

Tuxera for Mac2024免费读写硬盘U盘工具

作为软件产品专家,我对各类软件都有较为深入的了解,下面介绍Tuxera for Mac这款读写硬盘/U盘工具的相关信息: Tuxera for Mac是一款高效稳定的NTFS读写工具,专为解决Mac系统无法直接读写NTFS格式驱动器的问题而设计。它提供了完整…

直接插入排序 希尔排序 选择排序 堆排序

目录 一. 排序的概念及应用 1.1 排序的概念 1.2 常见的排序算法 二. 常见排序算法的实现(从小到大排序) 2.1 插入排序 2.1.1基本思想: 2.1.2 直接插入排序 2.1.3 希尔排序( 缩小增量排序) 2.2 选择排序 2.2.1基本思想: 2.2.2 直接选择排序: 2…

保障校园网络安全用堡垒机的几个原因分析

校园,人人都熟悉的地方,梦想知识开始的地方。在互联网数字化快速发展的今天,网络安全的学习环境是非常必要的。所以采购保障校园网络安全工具是必要的。那为什么一定要用堡垒机呢?这里我们一起来简单分析一下原因。 保障校园网络…

iOS - Runtime-消息机制-objc_msgSend()

iOS - Runtime-消息机制-objc_msgSend() 前言 本章主要介绍消息机制-objc_msgSend的执行流程,分为消息发送、动态方法解析、消息转发三个阶段,每个阶段可以做什么。还介绍了super的本质是什么,如何调用的 1. objc_msgSend执行流程 OC中的…

OceanBase中NOT EXISTS是否需要被改写

作者简介 张瑞远,曾经从事银行、证券数仓设计、开发、优化类工作,现主要从事电信级IT系统及数据库的规划设计、架构设计、运维实施、运维服务、故障处理、性能优化等工作。 持有Orale OCM,MySQL OCP及国产代表数据库认证。 获得的专业技能与认证包括 Oce…

安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 从0开始 工具操作解析【三】

同类博文; 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析【二】-CSDN博客 回顾以往 在以前的博文简单介绍了这款工具的rom制作全程。今天针对这款工具的…

Rust 02.控制、引用、切片Slice

1.控制流 //rust通过所有权机制来管理内存,编译器在编译就会根据所有权规则对内存的使用进行 //堆和栈 //编译的时候数据的类型大小是固定的,就是分配在栈上的 //编译的时候数据类型大小不固定,就是分配堆上的 fn main() {let x: i32 1;{le…

YoloV5改进策略:Neck和Head改进|ECA-Net:用于深度卷积神经网络的高效通道注意力|多种改进方法|附结构图

摘要 本文使用ECA-Net注意力机制加入到YoloV5Neck和Head中。我尝试了多种改进方法,并附上改进结果,方便大家了解改进后的效果,为论文改进提供思路。(改进中。。。。) 论文:《ECA-Net:用于深度…

Android中运动事件的处理

1.目录 目录 1.目录 2.前言 3.程序演示 4.第二种程序示例 5.扩展 2.前言 触摸屏(TouchScreen)和滚动球(TrackBall)是 Android 中除了键盘之外的主要输入设备。如果需要使用触摸屏和滚动球,主要可以通过使用运动事…

ruoyi-nbcio-plus基于vue3的flowable的流程条件的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

JavaScript中的继承方式详解

Question JavaScript实现继承的方式? 包含原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承和ES6 类继承 JavaScript实现继承的方式 在JavaScript中,实现继承的方式多种多样,每种方式都有其优势和适用场景。以下…

HarmonyOS(鸿蒙开发)入门篇

如果需要学习鸿蒙开发可以查看以下学习资源链接 OpenAtom OpenHarmony Develop applications - HUAWEI HarmonyOS APP 转载请注明出处HarmonyOS(鸿蒙开发)入门篇-CSDN博客,谢谢!

unity 数据的可视化

【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学-腾讯云开发者社区-腾讯云 Package https://github.com/XCharts-Team/XCharts/releases 官方文档案例 入门教程:5分钟上手 XCharts 3.0 | XCharts (xcharts-team.github.io)

Linux 系统基础操作命令

当前市面上常见的系统:Windows、Linux、Mac OS、Android、IOS…… Linux 不太适合日常使用,但是非常适合用于开发。因此作为一个程序猿来说,Linux 都是务必要掌握的。 Linux 介绍 Linux 发行版 目前市面上比较知名的发行版有:R…
最新文章