数据结构笔记 B 树 B+树

1 B树

Balanced 树,多路平衡搜索树

1.1 特征

一个m阶的B树具有如下几个特征:

  • 根结点的儿子数为[2, M];
  • 除根结点以外的非叶子结点的儿子数为[M/2, M];(M/2向上取整)
  • 每个结点存放至少M/2-1(M/2向上取整)和至多M-1个关键字;
  • 非叶子结点的关键字个数=指向儿子的指针个数-1;
  • 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
  • 非叶子结点的指针:P[1], P[2], …, P[M];
    • P[1]指向关键字小于K[1]的子树
    • P[M]指向关键字大于K[M-1]的子树
    • 其它P[i]指向关键字属于(K[i-1], K[i])的子树;
  • 所有叶子结点位于同一层

上面这些特征可能看得云里雾里的,我们直接看一个例子:

1.2 举例

1.3 查询

比如查询9:

从根节点开始,先跟8比较

大于8,所以找到8的右孩子,也就是(0010,0012)节点

跟10比较,比10小,所以找到该节点的最左孩子9

跟9比较,等于要查找的数值,返回

 1.4 插入

首先查找,找到合适的位置,也就是(0013,0015)这个节点

 16插入该节点,变成(0013,0015,0016)

由于这是一个3阶B数,所有每个节点里面最多有3-1=2个关键词

 

 为了符合B-树的特性,将会增加父节点的元素个数

 

向上传递元素,传递的原则就是中间值优先,所以传递元素为15

 此时父节点不满足3阶B数特性了,所以再往上一级传递元素,传递元素为12

 

根节点,变成了(0008,0012),他需要有三个孩子,所以将根节点的右孩子,拆分成了两个

1.5 删减

首先还是要先找到目标值,即16这个结点 

将其删除,此时15节点的子孩子只有一个,不符合3阶B树需要[3/2+1,3]个子孩子的限制

 

将16的父节点元素较大值15往下放

同时将15的父节点元素较大值12往下放

此时根节点只有一个元素8,只能有两个子节点

将10和12合并成(0010,0012)

 

 2 B+树

B-树的变体,也是一种多路搜索树

2.1  B+树特征

一棵m阶B+树和m阶的B-树的差异在于:

  • 有n棵子树的节点中含有n个关键字(即每个关键字对应一棵子树);
  • 叶子节点中包含了全部关键字的信息, 及指向含这些关键字记录的指针
  • 叶子节点本身依关键字的大小自小而大顺序链接;
  • 所有的非终端节点可以看成是索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字哦(非叶子节点不含有任何信息)
  •  除根节点外,其他所有节点中所含关键字的个数必须>=⌈m/2⌉(比B树多一个)

2.2 举例

  • 通常在B+树上有两个指针头, 一个指向根节点,另一个指向关键字最小的叶子节点。
  • 因此,可以对B+树进行两种查找运算: 一种是从最小关键字起顺序查找,另一种是从根节点开始,进行随机查找

2.3 B+树相比于B树的优势

2.3.1 磁盘读写代价更低

  • B+树的内部结点并没有指向关键字具体信息的指针,因此其内部结点占用内存相对B 树更小。
  • 如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存中的可以查找的关键字也就越多。
    • ——》相对来说IO读写次数也就降低了;

2.3.2 查询效率更加稳定

  • 由于非叶子结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。
  • 所有关键字查询的路径长度相同,导致每一个数据的查询效率相当

2.3.3 便于范围查询

  • 范围查找是数据库的常态
  • B树虽然提高了IO性能,但是并没有解决元素遍历的效率低下

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

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

相关文章

在Ubuntu系统上部署Inis博客,并使用内网穿透将博客网站发布到公共互联网上

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总…

Pandas画图报错:ValueError: signal only works in main thread

Pandas画图报错&#xff1a;ValueError: signal only works in main thread 基于Django 解决方法 按如下方式运行服务器 python manage.py runserver --nothreading --noreload

录音频用什么软件?助你轻松捕捉声音!

“有没有什么录音频的软件推荐呀&#xff1f;学校要求拍摄一个关于交通安全的纪录片&#xff0c;现在视频拍摄好了&#xff0c;音频却出了问题&#xff0c;需要重新补录声音&#xff0c;但是找不到合适的录音频软件&#xff0c;有人知道吗&#xff1f;” 录制音频是我们在工作…

Linux共享内存

共享内存&#xff1a;进程直接访问共享内存&#xff0c;由使用者进行访问控制&#xff08;互斥等&#xff09; 使用ipcs命令查看系统共享内存 POSIX 共享内存 有名共享内存 多个进程通过共享内存的名字来获取同一块共享内存&#xff0c;实现共享 #include <stdio.h>…

沉醉于代码的境界:探寻计算机书籍的奇妙之旅

文章目录 书中的代码乐章科技解密的乐趣技术指南的引路明灯书籍带给我的启示结语 &#x1f389;欢迎来到数据结构学习专栏~沉醉于代码的境界&#xff1a;探寻计算机书籍的奇妙之旅 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f38…

修改 jar 包中的源码方式

在我们开发的过程中&#xff0c;我们有时候想要修改jar中的代码&#xff0c;方便我们调试或或者作为生产代码打包上线&#xff0c;但是在IDEA中&#xff0c;jar包中的文件都是read-only&#xff08;只读模式&#xff09;。那如何我们才能去修改jar包中的源码呢&#xff1f; 1.…

【App测试】adb三大连接方式-夜神模拟器+真机+android真机(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 adb连接安卓模拟器…

如何驾驭逻辑、形式逻辑与AI算法?

逻辑错误与逻辑形式错误是有区别的&#xff1a; 逻辑错误经常表现为没有逻辑因果&#xff0c;用辩证法、阴谋论和统计归纳替代因果演绎&#xff1b;而逻辑形式错误是&#xff1a;前提是形式和内容需要分离&#xff0c;就像数学与语文分开&#xff0c;数学代表形式&#xff0c;…

从3大维度9个细节聊一聊,边缘计算盒子如何选型

人工智能的蓬勃发展&#xff0c;物联网设备的部署和5G无线技术的到来&#xff0c;越来越多的新兴场景对智能化应用提出了低时延、低带宽、本地化、高安全、低成本的处理需求&#xff0c;包括智慧城市、智慧金融、智慧校园等领域&#xff0c;以及智慧交通、智慧工厂、智慧医疗等…

反射之Type类

Type类 Type接口是所有类型的父接口&#xff0c;有四个子接口和一个实现类。 Type实现图 Class类比较常见&#xff0c;表示的是原始类型。表示的Java类在JVM里表现为一个Class对象 ParameterizedType表示的是参数化类型&#xff0c;对应 List<T>、List<String> 等格…

Ansible 企业实战详解

一、ansible简介1. ansible是什么2.ansible的特点ansible的架构图 二、ansible 任务执行1、ansible 任务执行模式2、ansible 执行流程3、ansible 命令执行过程 二 .Ansible安装部署1.yum安装2.ansible 程序结构3、ansible配置文件查找顺序4、ansible配置文件5.ansible自动化配置…

腾讯云2核4G和4核8G服务器配置5年租用价格表

腾讯云服务器网整理五年云服务器活动 txyfwq.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频…

人工智能基础_机器学习035_多项式回归升维实战2_使用sklearn的PolynomialFeatures进行升维---人工智能工作笔记0075

我们再来做一个升维处理,这里我们不再自己去对数据进行比如,相乘操作,来给数据手动添加维度了, 这里我们用sklearn库提供的PolynomialFeatures来自动对数据进行升维. from sklearn.linear_model import LinearRegression # PolynowlalFeatures,多项式升维处理 from sklearn.…

婴儿洗衣机哪个牌子比较好?好用的内衣洗衣机推荐

宝宝衣服的清洗对父母来说都很重要&#xff0c;所以挑选一款适合宝宝的小型洗衣机显得尤为重要。也许有许多人认为&#xff0c;为婴儿购买独立的洗衣机是不必要的&#xff0c;但是你是否了解呢&#xff1f;新生婴儿的肌肤要比成人更脆弱&#xff0c;更易受到感染而受到伤害&…

保护数字前沿:下一代防火墙如何塑造网络安全的未来

下一代防火墙通过提供先进的威胁检测、精细控制和云安全功能&#xff0c;正在重塑网络安全的未来。随着数字环境的不断发展&#xff0c;组织必须采用这些创新解决方案来保护其数字资产并维护安全的数字前沿。 在当今互联的世界中&#xff0c;网络威胁变得越来越复杂&#xff0c…

高德地图系列(三):vue项目利用高德地图实现地址搜索功能

目录 第一章 效果图 第二章 源代码 第一章 效果图 高德地图为我们提供了搜索联想&#xff0c;以及搜索结果标记&#xff0c;该案例已将基础功能打通&#xff0c;后续我们肯定还会对功能有所修改,想实现自己想要的效果&#xff0c;基本上看高德地图文档对着改就好了&#xf…

深度强化学习论文中的阴影折线图——总结和分析

前言 作为目前人工智能算法的一个重要领域&#xff0c;强化学习算法的表现非常出色&#xff0c;然而&#xff0c;强化学习算法的结果是出了名的不稳定&#xff1a;超参数的搜索空间往往非常大&#xff0c;算法对不同超参数都较为敏感&#xff0c;且哪怕仅仅只有随机数种子的不…

FineReport -问题学习图表设计图表类型-单元格扩展父子格-报表预览

1,问:为什么本地每次预览都要填帐号密码?答:模板认证关闭一下及可 2.单元格扩展与父子格----左父格-扩展方向-箭头往那个方向就往那个方向 1)数据集参数 在定义数据集时,通过使用if函数判断参数的值是否为空,若为空就不过滤参数,若不为空就进行参数过滤。SELECT * FROM…

Windows UAC权限详解以及因为权限不对等引发的若干问题分享

目录 1、什么是UAC&#xff1f; 2、微软为什么要设计UAC&#xff1f; 3、标准用户权限与管理员权限 4、程序到底以哪种权限运行&#xff1f;与哪些因素有关&#xff1f; 4.1、给程序设置以管理员权限运行的属性 4.2、当前登录用户的类型 5、案例1 - 无法在企业微信聊天框…

吊椅在欧盟做EN581报告认证

什么是EN 581标准&#xff1f; EN 581标准是欧洲标准化委员会制定的关于户外家具机械物理性能要求的标准。该标准主要涉及耐候性、抗静态载荷、耐磨性、抗腐蚀性等方面的要求。 5.2 如何提高家具的抗静态载荷性能&#xff1f; 提高家具的抗静态载荷性能可以通过增加家具结构的…