主要参考:https://www.cnblogs.com/vincently/p/4526560.html
https://blog.csdn.net/zwz2011303359/article/details/63262541
B树与B+树是用作外查找的数据结构,其中的数据放在外存中。
B树
B树中所有节点的孩子节点的最大值称为B树的阶,记作m。从查找效率考虑, 要求m>=3。
- 根节点至少有两个子树;
- 每个节点最多含有m-1个关键字,并以升序排列(每个节点最多有m棵子树);
- 除根节点外,其他非叶子结点最少含有m/2个子节点;
下图是一个M=4 阶的B树:
下面是往B树中依次插入
6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4
的演示动画:
在B树中进行查找时,其查找时间主要花费在搜索节点上,即主要取决于B树的高度,B树查找的时间复杂度为O(logN).
B+树
B+树是对B树的一种变形树,它与B树的差异在于:
- 有k个子树的结点必然有k个关键字;
- 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
- 树的所有叶结点构成一个有序链表,可以按照关键字排序的次序遍历全部记录。
下图是B+树的插入动画:
B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。
B+ 树的优点在于:- 由于B+树在内部节点上不好含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子几点上关联的数据也具有更好的缓存命中率。
- B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
两者的主要差异
(1)在B+树中,具有n个关键字的节点含有n棵子树,即每个关键字对应一棵子树;
而在B树中,具有n个关键字的节点含有(n+1)棵子树。
(2)B+树中的所有叶子结点包含了全部关键字,即其他非叶子结点中的关键字包含在叶子结点;
而在B树在关键字是不重复的。
(3)B+树中的所有非叶子节点仅起到索引的作用,不含有该关键字对应记录的存储地址(即节点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针);
而在B树中,每个关键字对应一个记录的存储地址。
(4)通常B+树上有两个指针,一个指向根节点,一个指向关键字最小的叶子结点,所有叶子结点链接成一个不定长的线性链表。
所以,B树只能进行随机查找,而B+树可以进行随机查找和顺序查找。
来个形象点的图: