【恋上数据结构与算法一】(十)B树

B树(B-tree、B-树)

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

◼ 仔细观察B树,有什么眼前一亮的特点?
1、1 个节点可以存储超过 2 个元素、可以拥有超过 2 个子节点
2、拥有二叉搜索树的一些性质
3、平衡,每个节点的所有子树高度一致
3、比较矮

m阶B树的性质(m≥2)

◼假设一个节点存储的元素个数为 x
根节点:1 ≤ x ≤ m − 1

非根节点:┌ m/2 ┐ − 1 ≤ x ≤ m − 1

如果有子节点,子节点个数 y = x + 1
✓根节点:2 ≤ y ≤ m

✓非根节点:┌ m/2 ┐ ≤ y ≤ m
➢比如 m = 3,2 ≤ y ≤ 3,因此可以称为(2, 3)树、2-3树
➢比如 m = 4,2 ≤ y ≤ 4,因此可以称为(2, 4)树、2-3-4树
➢比如 m = 5,3 ≤ y ≤ 5,因此可以称为(3, 5)树
➢比如 m = 6,3 ≤ y ≤ 6,因此可以称为(3, 6)树
➢比如 m = 7,4 ≤ y ≤ 7,因此可以称为(4, 7)树

注释:┌ ┐表示向上取整

◼思考:如果 m = 2,那B树是什么样子?
◼你猜数据库实现中一般用几阶B树?
200 ~ 300

B树 VS 二叉搜索树

◼B树 和 二叉搜索树,在逻辑上是等价的

◼多代节点合并,可以获得一个超级节点
2代合并的超级节点,最多拥有 4 个子节点(至少是 4阶B树)
3代合并的超级节点,最多拥有 8 个子节点(至少是 8阶B树)
n代合并的超级节点,最多拥有 2ⁿ个子节点( 至少是 2ⁿ阶B树)

◼m阶B树,最多需要 log2m 代合并

搜索

◼ 跟二叉搜索树的搜索类似

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

添加

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

◼插入55

◼插入95

◼再插入 98 呢?(假设这是一棵 4阶B树)
最右下角的叶子节点的元素个数将超过限制
这种现象可以称之为:上溢(overflow)

添加 – 上溢的解决(假设5阶)

◼上溢节点的元素个数必然等于 m

◼假设上溢节点最中间元素的位置为 k
将 k 位置的元素向上与父节点合并

将 [0, k-1] 和 [k + 1, m - 1] 位置的元素分裂成 2 个子节点
✓这 2 个子节点的元素个数,必然都不会低于最低限制(┌ m/2 ┐ − 1)

◼ 一次分裂完毕后,有可能导致父节点上溢,依然按照上述方法解决
最极端的情况,有可能一直分裂到根节点

添加

◼插入 98

◼插入 52

◼插入 54

删除 – 叶子节点

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

◼删除 30

删除 – 非叶子节点

◼假如需要删除的元素在非叶子节点中

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

2.再把前驱或后继元素删除

◼删除 60

◼非叶子节点的前驱或后继元素,必定在叶子节点中
所以这里的删除前驱或后继元素 ,就是最开始提到的情况:删除的元素在叶子节点中
真正的删除元素都是发生在叶子节点中

删除 – 下溢

◼删除 22 ?(假设这是一棵 5阶B树)
叶子节点被删掉一个元素后,元素个数可能会低于最低限制( ≥ ┌ m/2 ┐ − 1 )
这种现象称为:下溢(underflow)

删除 – 下溢的解决

◼下溢节点的元素数量必然等于 ┌ m/2 ┐ − 2
◼如果下溢节点临近的兄弟节点,有至少 ┌ m/2 ┐ 个元素,可以向其借一个元素
将父节点的元素 b 插入到下溢节点的 0 位置(最小位置)
用兄弟节点的元素 a(最大的元素)替代父节点的元素 b
这种操作其实就是:旋转

◼如果下溢节点临近的兄弟节点,只有 ┌ m/2 ┐ − 1 个元素
将父节点的元素 b 挪下来跟左右子节点进行合并
合并后的节点元素个数等于┌ m/2 ┐ + ┌ m/2 ┐ − 2,不超过 m − 1
这个操作可能会导致父节点下溢,依然按照上述方法解决,下溢现象可能会一直往上传播

删除

◼删除 22 ?(假设这是一棵 5阶B树)

4阶B树

◼ 如果先学习4阶B树(2-3-4树),将能更好地学习理解红黑树

◼ 4阶B树的性质
所有节点能存储的元素个数 x :1 ≤ x ≤ 3
所有非叶子节点的子节点个数 y :2 ≤ y ≤ 4

◼添加
从 1 添加到 22

◼删除
从1删除到22

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

推荐阅读更多精彩内容