B树
B树相比二叉树就是每个节点多了更多的子树,节点中存储了一些子树的信息,B树一般用来作为磁盘存取的数据结构,磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂旋转。盘片旋转就是我们说的多少转每分钟。,而磁臂移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘的时候,显然定位是一个非常花费时间的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提过磁盘读取时定位的效率。
我们可以根据B类树的特点,构造一个多阶的B类树,然后再尽量多的在节点上存储相关的信息,保证层数尽量的少,以便我们可以更快的找到信息,磁盘的I/O操作也少一些,而且B类树是平衡树,每个节点到叶子结点的高度都是相同,这也保证率每个查询时稳定的。可见,B树的功能就是优化二叉树的高度,以便减小磁盘的IO的次数,提高访问效率
B树满足的条件:
1.每个节点最多有m个子树(儿子),且M>2
2.当有子树的时,根节点至少拥有两个子树,(根结点的儿子数为[2, M])
3.除了根节点,每个分直接点至少拥有m/2棵树
4.所有叶节点都在同一层上
5.每个有K个子树的节点会存储k-1个关键码,关键码感召递增次序进行排序
6.关键字的数量满足ceil(m/2)-1<=n<=m-1
B树的特征:
1.关键字集合分布在整棵树中;
2.任何一个关键字出现且只出现在一个结点中;
3.搜索有可能在非叶子结点结束;
4.其搜索性能等价于在关键字全集内做一个二分查找
B+树
B+树的特征:
1.有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子结点(B树是每个关键字都保存数据)
2.所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子节点本书依关键字的大小自小而大顺序链接
3.所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字
4.通常在B+树上有两个头指针,一个指向根节点,一个指向关键字最小的叶子结点
5.同一个数字会在不同节点中重复出现,根节点的最大元素就是B+树的最大元素
B+树在B树的基础上做了优化,它与B树的差异在于:
(1)有K个子节点的节点必然有k个key
(2)非叶子结点仅具有索引作用,跟记录有关的信息均放在叶子节点中
(3)树的所有叶子节点构成一个有序链表,可以按照Key排序的次序遍历全部记录
即,B和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。
B+树的优点在于:
1.由于B+树在内部节点上不包含数据信息,因此在内存页中能够存放更多的key。
数据存放的更加紧密,具有更好的空间局部性。
因此访问叶子节点上关联的数据也具有更好的缓存命中率。
2.B+树的叶子结点都是相链的,因此对整棵树的便利只需要一次线性遍历叶子结点即可。
而且由于数据顺序排列并且相连,所以便于区间查找和搜索。
而B树则需要进行每一层的递归遍历,相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
但是B树也有优点,其优点在于:
由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。