12-B树

  • B树(B-tree,B-树)

B树是一种平衡的多路搜索树,多用于文件系统,数据库的实现

仔细观察B树,有什么眼前一亮的特点吗?

  1. 1个节点可以存储超过2个元素,可以拥有超过2个子节点
  2. 有用二叉搜索树的一些性质
  3. 平衡,每个节点的所有子树高度一致
  4. 比较矮
  • m阶B树的性质(m ≥ 2)

阶:从上图可以看到,有3阶B树,有4阶B树,有5阶B树,这里的阶表示一个节点,最多可以拥有多少个子节点

性质:假设一个节点存储的元素个数为X

  1. 根节点:1 ≤ X ≤ m - 1
  2. 非根节点:⌈m / 2⌉ - 1 ≤ X ≤ m - 1 (⌈⌉表示向上取整)
  3. 如果有子节点:子节点个数 Y = X +
    • 根节点:2 ≤ Y ≤ m
    • 非根节点:⌈m / 2⌉ ≤ Y ≤ m

例如:m = 3 ,此时 Y的取值范围为 2 ≤ Y≤ 3,因此可以成为(2,3)树,或者2-3树

在如:m = 4 ,此时 Y的取值范围为 2 ≤ Y≤ 4,因此可以成为(2,4)树,或者2-3-4树

或者:m = 5 ,此时 Y的取值范围为 3 ≤ Y≤ 5,因此可以成为(3,5)树,或者2-3-4-5树

思考:如果m = 2,那么B树是什么样子?

  • B数 VS 二叉搜索树

  1. B树和二叉搜索树,在逻辑上是等价的
  2. 多代节点合并,可以获得一个超级节点(二叉搜索树通过父子节点的合并,可以转换为B树中的一个节点)
    • 2代合并的超级节点,最多拥有4个子节点(至少是4阶B树)
    • 3代合并的超级节点,最多拥有8个子节点(至少是8阶B树)
    • n代合并的超级节点,最多拥有2n个子节点(至少是2n阶B树)
  3. m阶B树,最多需要logm代合并
  • 搜索

和二叉搜索树的搜索类似

  1. 先从节点内部,从小到大开始搜索元素
  2. 如果命中,搜索结束
  3. 如果未命中,再去对应的子节点中搜索元素,重复步骤1
  • 添加

  1. 新添加的元素必定是添加到叶子节点

例如下图,现要往该B数种插入元素55

插入完成后的结果为

然后再往B树种插入元素95,完成后的结果为

如果再插入98呢?(假设这是一颗4阶B树)

此时,最右下角的叶子节点的元素个数将超过限制,这种现象可以称为上溢(overflow)

上溢问题的解决

当节点发生上溢时,此时该节点的元素个数必然等于该B树的阶数,如下图的一个5阶B树节点,添加一个元素后

假设上溢节点,最中间元素的位置为K

  1. 将K位置的元素向上与付节点合并
  2. 再将[0,K - 1] 和 [K +1,m - 1]位置的元素分裂成为2个子节点[下图]

一次分裂完毕以后,有可能导致父节点上溢,依照上述方法解决,在极端的情况下,有可能一直分裂到根节点,假设上图上溢的节点为根节点,最终分裂后的结果为

通过上面的结论,可以完成下面一棵B树的添加操作

首先添加元素98,此时右下角的节点发生上溢,分裂合并后的结果

然后再添加元素52,此时没有发生上溢,直接添加到了节点中

接着我们添加元素54,通过这次添加,值为50的节点发生上溢,分裂合并后导致父节点上溢,最终父节点也会分裂合并,最终合并到了祖父节点中

  • 删除

叶子节点

假如需要删除的元素在叶子节点中,那么直接删除即可,如下图的B树

现在对其删除30的操作,删除后的结果为

非叶子节点

假如需要删除的元素在非叶子节点中,如下面的B树中

执行删除60的操作,此时如果直接删除的话,根节点中就只剩一个元素了,此时不能形成该节点有3个子节点的条件,因此这时候需要

  1. 找到前驱或者后继元素,覆盖所需删除元素的值
  2. 再把前驱或后继元素删除

通过该方法,删除完成后的结果为

通过观察上图可以发现,非叶子节点的全区或者后继元素,必定在叶子节点

所以在这里的删除前驱或者后继元素,就是最开始提到的情况,删除的元素在叶子节点中

因此真正的删除元素,都是发生在叶子节点当中

通过以上的结论,假设下图是一棵5阶B树

如果我们删除元素22。由于是5阶B树,所以每个节点至少存储2-4个元素

叶子节点被删除掉一个元素后,元素的个数可能会低于最低限制(≥ ⌈m / 2⌉ - 1),这种情况下,可能会导致下溢(underflow)

下溢问题的解决

由于B树的性质,我们可以知道,下溢节点的元素数量必然等于⌈m / 2⌉ - 2,如下图

如果下溢节点临近的兄弟节点,至少有⌈m / 2⌉ 个元素,可以向其借一个元素

将父节点的元素b插入到下溢节点的0位置(最小位置)

这种操作其实就是:旋转

如果下溢节点临近的兄弟节点,只有⌈m / 2⌉ - 1 个元素[下图]

此时就需要将付节点的元素b挪下来和左右子节点进行合并[下图],合并后的节点元素个数等于⌈m / 2⌉ + ⌈m / 2⌉ - 2 ,不超过 m - 1

这个操作可能会导致父节点下溢,按照上述的方法解决,以下现象可能会一直往上传播

  • 练习

画出4阶B树(2-3-4树),将能更好的学习理解红黑树

4阶B树的性质

  1. 所有节点能存储的元素个数 X : 1 ≤ X ≤ 3
  2. 所有非叶子节点的子节点个数Y : 2 ≤ Y ≤ 4
  • 练习从1添加到22
  • 练习从1删除到22

最终添加完成的结果为下图

GitHub地址
本节完!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balan...
    铁甲依然在_978f阅读 1,447评论 0 4
  • 原文链接 B树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(...
    非典型程序员阅读 1,158评论 0 3
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,797评论 0 13
  • 本文转载自博客,因为题主写的已经很详细了。 写在前面的一点,面试专用(m阶指的是每个节点最多有m个子树)。 一个m...
    放开那个BUG阅读 1,175评论 0 5
  • 收拾完屋子,再把第二天一家三口出门的包包准备好,已经是晚上十点半了。林深有些疲累,她催促儿子赶紧去睡觉之后,这才坐...
    役子述阅读 188评论 0 0