📜  B树和B +树之间的区别(1)

📅  最后修改于: 2023-12-03 14:39:36.815000             🧑  作者: Mango

B树和B+树之间的区别

概述

B树和B+树都是一种多路搜索树,用于在磁盘等外存储器中进行数据查找和存储。 它们在一个节点中可以存储多个关键字和子树指针,而且节点的大小正好等于一个页的大小(一般为4KB)。但是B树和B+树之间有一些不同之处。

B树

B树是由Rudolf Bayer和Edward McCreight在1972年发明的,B树的每一个非叶子节点都存储了关键字以及指向子树的指针。它的特点是,非叶子结点的关键字个数是子树个数−1,子树个数在m和2m之间,其中m是B树的阶数。相对于平衡树来说,B树的每一次查询可减少磁盘I/O次数,从而提高查询效率。

B树示意图

B-tree

B树插入操作

在B树中插入一个新元素时,当遇到需要插入的位置在一个满节点中时,会发生节点分裂,被分裂出的右半部分成为新的节点,并且将该节点中的中间元素插入到其父节点中。这种情况可能会沿着根节点一路上升到树的顶部。

B树查找操作

从根节点开始查找关键字,当查找的关键字小于节点中的最小值,则进入其第一个子节点查找。当大于节点中的最大值,则进入其最后一个子节点查找。如果在节点中找到要查找的关键字,则返回该关键字所在的节点和索引。

B+树

B+树也是由Rudolf Bayer和Edward McCreight在1972年发明的,与B树不同,B+树的内部节点并没有保存data信息,只保存key信息。 叶子节点保存了所有的关键字信息及指向相应数据块的指针。相对于B树来说,B+树的查找性能更加稳定,因为所有的数据都存在叶子节点中,非叶子节点中只包含关键字和指向下层节点的指针。

B+树示意图

B+-tree

B+树插入操作

在B+树中,新加入的key和data先插入到叶节点中,如果叶节点已经满,则需要进行节点分裂操作。被分裂出来的节点称为右兄弟节点,同时需要将右兄弟节点的最小值插入到其父节点中。这个过程会一直向上,直到根节点。

B+树查找操作

从根节点开始查找关键字,一直向下找到叶子节点,找到对应的key所在的叶子节点,然后在该叶子节点上进行线性查找,直到找到所需的数据。

B树和B+树对比

| B树 | B+树 | | :-------------: | :--------------: | | 非叶子节点也保存data信息 | 非叶子节点只保存key信息 | | 所有关键字都存在非叶子节点和叶子节点中 | 所有关键字都只存在叶子节点中 | | 叶子节点不需要链表结构 | 叶子节点需要链表结构 | | 查询性能较不稳定,但是每一次查询可减少磁盘I/O次数 | 查询性能较稳定,每次查询都会查找到叶子节点 | | 由于包含data信息,磁盘块可以直接读取数据 | 要查找data需要一次额外的IO |

总结

B树和B+树都是多路搜索树,用于在磁盘等外存储器中进行数据查找和存储。B树和B+树之间的最大区别是非叶子节点的结构形式,以及数据的存储方式。B树查询性能较不稳定,但是每一次查询可减少磁盘I/O次数,而B+树查询性能较稳定,但是需要一次额外的磁盘I/O来查找数据。因此,在选择使用哪种树时,需要根据具体的场景和需求来选择合适的树结构。