数据结构之B树和B+树
B树(B-tree):
为了减少磁盘IO次数,将二叉查找树的深度变低,每个结点存储更多的数据;
B树中所有结点的孩子结点最大值称为B树的阶,通常用m表示。一个结点有k个孩子时,必有k-1个关键字才能将子树中所有关键字划分为k个子集。
以上图为例:若查询的数值为5:
第一次磁盘IO:在内存中定位(与17、35比较),比17小,左子树;
第二次磁盘IO:在内存中定位(与8、12比较),比8小,左子树;
第三次磁盘IO:在内存中定位(与3、5比较),找到5,终止。
相较于查找二叉树,比较次数并没有减少,减少的是IO次数,三次IO就可以查找到数据
B+树
查找类似于B树,自根节点向下查找,结点内部使用二分查找,B+树的中间结点不存储卫星数据,只有索引,而B树是有卫星数据的,所以B+树存储的数据更多,相同数据量下磁盘IO次数更少
范围查找
B树的范围查找需要不断依赖中序遍历。首先二分查找到范围下限,在不断通过中序遍历,知道查找到范围的上限即可。整个过程比较耗时。
而B+树的范围查找则简单了许多。首先通过二分查找,找到范围下限,然后同过叶子结点的链表顺序遍历,直至找到上限即可,整个过程简单许多,效率也比较高
查找[3~11]的数据,
B+树:找到下限3,然后链表顺序查找到数据11即可
B树: 找到下限3,中序遍历得到8,再次中序遍历得到11
稳定性
因为卫星数据的不同,导致查询过程也不同;B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定