首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你好,我是B树

你好,我是B树

作者头像
WindWant
发布于 2021-07-23 08:15:27
发布于 2021-07-23 08:15:27
3790
举报
文章被收录于专栏:后端码事后端码事

一、什么是B树?

B树是一棵是具备以下特点的有根树

1、节点属性

a)x.n:为节点中存储的关键字个数

b)x.key:为节点中存储的关键字。x.key1、x.key2 ... x.keyx.n 以非降序顺序排列,满足 x.key1 <= x.key2 ... <= x.keyx.n。

c)x.leaf:为当前节点是否为叶子节点(true | false)

d)x.c:为指向子节点的指针,内部节点包含指针个数为 x.n + 1,叶子节点没有子节点,所以没有此属性。

2、分割

关键字 x.key 对存储在子树中的关键字进行分割。某个子节点的所有关键字值范围总是在节点 x 的某两个关键字之间。这个值可能是任何可排序的表示,比如:

3、深度

每个叶子节点具有相同的深度,即树的高度(由根节点到叶子节点的路径长度)。

4、度数

每个节点包含的关键字个数有上下界限制。基本表示单位为B树的最小度数 t(满足 t >= 2):

a)除了根节点外(空树没有关键字,非空树根节点至少包含一个关键字),每个节点至少有 t - 1 个关键字,进而可以推导,每个内部节点至少有 t 个子节点【1.d】。

b)每个节点至多包含 2t - 1 个关键字(此时称之为【满】 状态),进而可以推导,每个内部节点至多有 2t 个子节点【1.d】。

二、B数的高度

首先树的根节点至少包含 1 个关键字,其它节点至少包含 t - 1 个关键字,至少有 t 个子节点【一.4.a】。

我们知道 B 树的度数 t >= 2,所以:

深度为 1 的位置上至少有 2 个节点。

深度为 2 的位置至少有 2 * t 个 节点。

深度为 3 的位置至少有 2 * t * t 个 节点。

... ...

深度为 h 的位置至少有 2 * t * ... * t 个 节点。

图示:

【1】所以所有非根节点个数至少为:2 + 2 * t + 2 * t * t + 2 * t * ... * t = 2 * t0 + 2 * t1+ 2 * t2 + 2 * th-1,标识为 sum(node)

【2】相应的非根节点关键字个数至少为:(t - 1) * sum(node)

【3】那么总的关键字个数至少为: 1 + (t - 1) * sum(node)

【4】我们用 n 表示关键字个数,所以存在 n >= 1 + (t - 1) * sum(node),代入【1】中的求和,最终经过一系列的变换,可以得出B树的高度满足:h <= logt(n+1)/2

三、B树的搜索

假定我们要查找的关键字为 k,入口节点 x:

a)需要找到 k 在 x 所有关键字中的位置,临界关键字 keyi 满足 k <= keyi

b)如果存在 k == keyi 那么查找结束,否则继续。

c)如果 x 为叶子节点,则查找结束,否则继续

d)由 keyi 临界关键字,我们可以得到相应指向子节点的指针 ci

然后,继续由 ci 指向的子节点作为入口节点,继续上述过程。

四、B树的插入

B树插入新关键字后,必须仍然是一颗合法的B树。

由【一.4.b】我们直到 B 树节点存在一种状态【满】,即当前节点关键字个数为 2t -1。【满】状态的节点插入新节点必须经过特定的前置处理:分裂

所谓分裂,即将节点由中间关键字作为分割点,分割为两个节点,每个节点包含 t - 1 个关键字,中间节点 x.kt 则上升到父节点中,作为两棵子树的划分点,参见【一.2】。

此处需要注意的是,如果父节点同样为【满】节点,那么在分割点上升之前,同样需要对父节点执行【分裂】操作。

满节点的分裂行为会沿着树向上传播直到不再需要分裂为止

上面我们描述的过程,是一个自下而上的【满】状态分裂传播行为。

我们知道,要实现节点的插入,首先需要经过一个B树的搜索查找的过程,搜索过程自上而下

显然,两个过程,有些重复,我们需要的是单向查找插入。

鉴于此,在执行查找的过程中,遇到路径上的满节点,则执行分裂操作,直到找到位置插入节点,这样就避免了自下而上的【分裂】传播行为。

五、B树的删除

B树删除特定关键字后,必须仍然是一颗合法的B树。

B树的插入是一个对节点最大关键字数量的约束满足过程,相应的,B树的删除是一个对节点最小关键字数量的约束满足过程

保障沿途节点关键字数量至少为度数 t,一遍自根而下执行删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL学习笔记之B+树的几点总结
本文主要以列表形式将B+树的特点以及注意点等列出来,主要参考《算法导论》、维基百科、各大博客的内容,结合自己的理解写的,如内容有不当之处,请各位雅正。
Jetpropelledsnake21
2018/08/01
5410
SQL学习笔记之B+树的几点总结
Mysql索引
索引是什么了,查阅了官方文档。官方文档写了索引的作用和没有索引会带来全表扫描,非常费时间。 Indexes are used to find rows with specific column values quickly. Without an index, MySQL must begin with the first row and then read through the entire table to find the relevant rows. 简单的说索引是提高查询速度。这个很好理解,就像是以前的英文词典,找单词如果没有前面目录的话,效率很低,得全文找一遍。
mikelLam
2022/10/31
2.8K0
算法数据结构(一)-B树
介绍 B树的目的为了硬盘快速读取数据(降低IO操作次树)而设计的一种平衡的多路查找树。目前大多数据库及文件索引,都是使用B树或变形来存储实现。 目录 为什么B树效率高 B树存储 B树缺点 为什么B树效
蘑菇先生
2018/05/21
8540
B树
  B树是为磁盘或其他存取的辅助存储设备而设计的一种平衡搜索树。B树类似于红黑树,但是在降低磁盘I/O方面表现很好。   B树和红黑树不同之处在于B树的节点可以有很多孩子,从数个到数千个。B树的严格高度可能比一棵红黑树的高度要小很多,因此可以使用B数在O(lgn)内完成一些动态集合的操作。   如果B树的一个内部节点x包含x.n个关键字,那么节点x就要x.n+1个孩子。节点x中的关键字就是分割点,它把节点x中所处理的关键字的属性分割为x.n+1个子域,每个子域都由x的一个孩子处理。当在一棵B树中查找一个关
Mister24
2018/05/14
1.5K0
从B 树、B+ 树、B* 树谈到R 树
说明:本文从B树开始谈起,然后论述B+树、B*树,最后谈到R 树。其中B树、B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终由July统稿修订完成。
bear_fish
2018/09/14
2.4K0
从B 树、B+ 树、B* 树谈到R 树
文心一言 VS 讯飞星火 VS chatgpt (246)-- 算法导论18.1 4题
B树是一种自平衡的树,它保持数据有序,并允许对数时间复杂度的插入、删除和查找操作。B树的一个关键属性是其最小度数(t),它决定了树的结构和节点的最大、最小子节点数。
福大大架构师每日一题
2024/04/30
1500
文心一言 VS 讯飞星火 VS chatgpt (246)-- 算法导论18.1 4题
文心一言 VS 讯飞星火 VS chatgpt (251)-- 算法导论18.2 4题
B树(B-tree)是一种自平衡的树,常用于数据库和文件系统的索引结构。在B树中,每个节点最多有 m 个子节点(对于B树,m 是阶数,即节点的最大子节点数),并且每个非根节点至少有 ⌈m/2⌉ 个子节点(其中 ⌈x⌉ 表示不小于 x 的最小整数)。
福大大架构师每日一题
2024/05/18
1350
文心一言 VS 讯飞星火 VS chatgpt (251)-- 算法导论18.2 4题
【考研408&数据结构】一文讲透B树与B+树
平衡二叉树就是最典型 的平衡 没有学到平衡二叉树的朋友 可以移步到这里->啥b都能学明白的平衡二叉树
苏泽
2024/09/05
3520
【考研408&数据结构】一文讲透B树与B+树
文心一言 VS 讯飞星火 VS chatgpt (248)-- 算法导论18.2 1题
首先,我们要了解B树(B-tree)的基本概念和插入规则。B树是一种自平衡的树,主要用于磁盘或其他直接存取辅助设备中的数据存储。一个度为m的B树满足以下条件:
福大大架构师每日一题
2024/04/30
1390
文心一言 VS 讯飞星火 VS chatgpt (248)-- 算法导论18.2 1题
B-树和B+树的应用:数据搜索和数据库索引
定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树;
黄规速
2022/04/14
7900
B-树和B+树的应用:数据搜索和数据库索引
BTree实现原理
小编在看etcd存储(store)模块的时候,发现它在进行key和keyIndex转换的时候,用到了btree包(http://godoc.org/github.com/google/btree)。btree是Google开源的一个Go语言的BTree实现,整个代码不到1000行,实现的非常简练,组织分层也做的很好,并对gc和并发读写做了很多优化,值得一读。小编打算用两篇文章讲解BTree内容,本文上篇主要介绍实现原理,下篇主要介绍btree源码实现。
数据小冰
2022/08/15
1.6K0
BTree实现原理
DS高阶:B树系列
        若接近有序的数据插入到BS中,会导致退化成单支树,时间复杂度退化为O(N)
小陈在拼命
2024/05/26
1470
DS高阶:B树系列
面试官问你B树和B+树,就把这篇文章丢给他
在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。
好好学java
2019/09/24
5230
面试官问你B树和B+树,就把这篇文章丢给他
十年架构师带你剖析B树和B+树
在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区别。
美的让人心动
2019/11/21
2.1K0
十年架构师带你剖析B树和B+树
数据结构 —— B树和B+树
​ 最近在学习数据库相关的知识,了解到数据库很多是采用B-/+树作为索引,例如Mysql的InnoDB引擎使用的B+树、MongoDB默认采用B树作为索引。
俺也想起舞
2021/12/24
9.8K0
数据结构 —— B树和B+树
Java数据结构与算法解析(九)——B树
在计算机科学中,B树(英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。
老马的编程之旅
2022/06/22
5620
Java数据结构与算法解析(九)——B树
深入探讨磁盘B树的内部机制:代码实现与理论解析
红黑树、B/B+树、Hash是非常常用的数据结构,特别是布隆过滤器。这三个数据结构都是具备查找功能的,是一种强查找的数据结构。比如将它们用于存储一个集合,可以快速查找到指定的数据。排序的数据结构,在平常用的时候,基本上都是这几个。这篇文章都将帮助深入了解磁盘B树。
Lion 莱恩呀
2024/09/12
3010
深入探讨磁盘B树的内部机制:代码实现与理论解析
算法导论第十八章 B树
一、高级数据结构   本章以后到第21章(并查集)隶属于高级数据结构的内容。前面还留了两章:贪心算法和摊还分析,打算后面再来补充。之前的章节讨论的支持动态数据集上的操作,如查找、插入、删除等都是基于简单的线性表、链表和树等结构,本章以后的部分在原来更高的层次上来讨论这些操作,更高的层次意味着更复杂的结构,但更低的时间复杂度(包括摊还时间)。 B树是为磁盘存储还专门设计的平衡查找树。因为磁盘操作的速度要远远慢于内存,所以度量B树的性能,不仅要考虑动态集合操作消耗了多少计算时间,还要考虑这些操作执行了多少次磁盘
Linux云计算网络
2018/01/11
7760
算法导论第十八章 B树
MySQL和B树的不知道的那些事
若左子树不空,则左子树上所有节点的值均小于它的根节点的值 若右子树不空,则右子树上所有节点的值均大于它的根节点的值 它的左、右子树也分别为二叉排序数(递归定义)
终有救赎
2023/12/14
3140
MySQL和B树的不知道的那些事
MySQL索引原理——B树
1、MyISAM是MySQL 5.5之前版本默认的存储引擎,从5.5之后,InnoDB开始成为MySQL默认的存储引擎。MyISAM和InnoDB都是使用B+树实现主键索引、唯一索引和非主键索引。
saintyyu
2021/11/22
7440
MySQL索引原理——B树
相关推荐
SQL学习笔记之B+树的几点总结
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档