你有 “Mojito” ,我有 B+树!(概念篇)

各位朋友,你们好,今日没有更新文章,还请见谅~ 从今天开始将连续4日更新 B+树,今日是关于 B+树基本概念的一个介绍,希望今天的点滴内容未能让你失望!

为了实现动态多层索引,通常采用 B-树 和 B+树。但是,用于索引的 B-树 存在缺陷,它的所有中间结点均存储的是数据指针(指向包含键值的磁盘文件块的指针),与该键值一起存储在B-树的结点中。这就会导致可以存储在 B-树中的结点数极大地减少了,从而增加 B-树的层数,进而增加了记录的搜索时间。

B+树通过仅在树的叶子结点中存储数据指针而消除了上述缺陷。因此,B+树的叶结点的结构与 B-树的内部结点的结构完全不同。在这里应该注意,由于数据指针仅存在于叶子结点中,因此叶子结点必须将所有键值及其对应的数据指针存储到磁盘文件块以便访问。此外,叶子结点被链接磁盘的某个位置,以提供对记录的有序访问。因此,叶子结点形成第一级索引,而内部结点形成多层索引的其他层。叶子结点的某些关键字 key 也出现在内部结点中,充当控制搜索记录的媒介。

与 B-树不同,B+树中的结点存在两个阶(order):对于阶 “a” 和 “ b”,一个用于内部结点,另一个用于外部(或叶)结点。

阶为 a 的 B+树内部结点的结构如下:

  1. 对于每一个形如:

    的内部结点,其中 ,每一个 表示指向子树根结点的指针, 表示关键字值
  2. 对于每一个内部结点中的关键字值均满足:$K_1<k_2 <="" ...="" k_{c-1}$="" .(内部结点的关键字由小到大有序排列)<="" p="">

  3. 对于一个位于 所指向的子树中的结点 而言,满足:

    时,均有 .

    时, .

    时, .

  4. 每一个内部结点最多有 a 个指向子树的指针,即 c 最大取 a .

  5. 根结点至少包含两个指向子树的结点指针,即对于根结点而言 ; 除了根之外的每个结点都包含最少 个指向子树的指针。

  6. 如果任意一个内部结点包含 c 个指向孩子结点的指针且 ,则该结点包含 的关键字。

阶为 b 的 B+树叶子结点的结构:

  1. 对于每一个形如:

    的叶子结点,其中 是一个数据指针(指向磁盘上的值等于 的真实记录的指针,或者包含记录 的磁盘文件块), 是一个关键字, 表示 B+树中指向下一个叶子结点的指针。
  2. 对任意一个叶子结点均有:$K_1<k_2 <="" ...="" k_{c-1}$="" ,$c\le="" b$="" .<="" p="">

  3. 每一个叶子结点至少包含 个值.

  4. 所有的叶子结点在同一层。

使用 指针可以遍历所有的叶子结点,就和单链表一样,从而实现对磁盘上记录的有序访问。

下图为一颗完整的 B+树的结构示例:

B+树的优点

同为 层的 B-树和 B+树,B+树可以存储更多的结点元素,更加 ”矮胖“。这也是 B+树最大的优势所在,极大地改善了 B-树的查找效率。对于同样多的记录,B+树的高度会更矮,并且 指针的出现可以帮助 B+树快速访问磁盘记录且效率非常高。总之,就是 B+树比 B-树更加好,B+树的磁盘 I / O 会更少,相比于 B-树的中序遍历,B+树只需要像遍历单链表一样扫描一遍叶子结点。

推荐阅读:

图解:什么是B树(心中有 B树,做人要谦虚)?

作者:景禹,一个追求极致的共享主义者,想带你一起拥有更美好的生活,化作你的一把伞。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值