B树和B+树

B树:

什么是B树:

        B树,也被称为B-树。一棵m阶B树是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:①根结点至少有两个子女;②每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;(根据关键字搜索)③每个非根非叶子节点的子树个数 k 满足:┌m/2┐ <= k <= m ;④所有的叶子结点都位于同一层(所以是平衡的)。

        在B树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。
        除根结点以外的所有非叶子结点的度数(子节点数)与叶子节点数相同,为关键字总数加1;
        阶数:B树中含有的最多子节点数。

B树的结构:

        B树中的一任一非叶子节点都包含n个关键字和n+1个指针结点。一般形式为: (n,P0,K1,P1,K2,P2,…,Kn,Pn)。其中,n是该节点的关键字数目,Ki为关键字,K1<K2<…<Kn, Pi 是指向包括Ki到Ki+1之间的关键字的子树的指针。注:Pi指向的结点的所有关键字均小于Ki且大于Ki-1。(虽然百度上B树的结点是这个,但我感觉应该还有一个指向父节点的指针,因为到时插入的时候可能会对父节点进行操作)。

B树的查找、插入与删除:

        进行查找、插入、删除的时间复杂度为O(logn)。

        查找:

        从根节点开始,使用顺序查找或折半查找。以顺序查找为例,若找到相同的关键值,则返回该结点。否则从K1开始,找到第一个大于关键值的Ki,之后进入Pi-1所指向的结点(或者该结点所有关键值均小于次关键值,则进入结点Pn),重复此步骤直到找到或者进入空结点。

        插入:

        先对要插入的元素进行查找,若找到则不进行操作,直接返回。否则找到要插入的结点,判断插入后关键词数,①如果关键词数小于m,插入成功,返回。②若关键词数大于等于m,则将处于中间的关键词提取出来插入父节点中(需要继续判断),两边形成两个新的结点。

        删除:

        先对要删除的元素进行查找,若未找到则不进行操作,直接返回。①若该节点不是叶子结点,则使用其关键字左边的子树的最大关键字或者关键字右边子树的最小关键字替换,之后判断替换处的元素(若无左右子树则只进行删除)。②该节点为叶子结点,先删除该元素。若删除后的关键词数小于m/2,则查看其兄弟节点的关键词数是否大于m/2.若是,则用兄弟节点的关键词替换父节点的关键词,并将父节点的关键词加入到该节点中(保证所有节点的关键词大于等于m/2)。若无满足条件的兄弟节点,则将该节点与父节点并入一个兄弟节点中,之后对父节点进行判断(因为将父节点中的一个关键字并入子节点中)。

B树有什么用:

B树常被应用在数据库和文件系统的实现上

        由于数据库和文件系统存储的数据多,在查询时我们不能一下子将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。而磁盘I/O的效率很低,磁盘I/O的次数又与树的深度有关。所以用B数而非二叉排序树。

B+树 

        非聚集索引与聚集索引:聚集索引的叶子节点存储数据;非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键,想要查找数据我们还需要根据主键再去聚集索引中

进行查找,这个再根据聚集索引查找数据的过程,我们称为回表

什么是B+树        

B+树是B树的一种变形,B+树元素自底向上插入,一颗m阶B+树有如下特征: 

        ①每个结点的关键字个数与孩子个数相等,且非最下层的内层结点的关键字是对应子树上的最大关键字。
        ②只有叶子节点才保存信息,其他节点只保存关键字。且各个节点依关键字自小而大顺序链接。
        ③除根结点以外,每个非叶子结点有 m/2到m个子节点。
        ④所有叶结点都在树结构的同一层,因此B+树总是高平衡的。

B+树的结构:

        B+树中有叶子节点和非叶子节点,其中叶子节点包含:关键字数组、对应父节点的数组、存储关键字相关信息的数组、指向下一个叶子结点的指针;非叶子节点包括:关键字数组、对应父节点的数组、存储对应子节点的数组。

若该节点为叶子节点,则存储子节点的数组为空。否则存储关键字对应的信息为空。

        注意:B+树中所有叶子节点通过指针链相连,且按从小到大排序。

B+树的查找、插入与删除:

        B+树的查找与B树不同,当索引部分某个结点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子结点为止。 插入与删除拥有对数时间复杂度O(logN),N为存储的信息总数。

查找:

        查找时可以根据关键字使用顺序查找或者二分查找,与B树的查找不同点在于,找到之后若非叶子结点要继续向下查找直到搜索到叶子节点。若到叶子结点也未找到则说明无此关键字。

插入:

        在插入前先查找是否存在该关键字。若存在则结束插入。否则查找到要插入的叶子节点,查看该节点的关键字数是否为m,①关键字数不为m,将节点关键字及其信息存放在该节点中,之后再判断是否需要更新父节点的关键字(不断向上判断)②关键字数为m,则将关键字加入后从中间分为两个节点,通过指针相连接,并将新的关键字插入父节点中(不断向上判断且可能需要创建一个新的节点)。

删除:

        首先查找要删除的节点,若未找到则结束删除。否则查看该节点的关键字数是否大于m/2①关键字数大于m/2,直接删除该关键字和对应的数据,还要判断是否需要更新父节点的关键字(不断向上判断)②关键字数为m/2。删除后将其与兄弟节点合并,删除原节点的父节点关键字(不断向上判断)。

B+树有什么用:

        通常用于数据库和操作系统的文件系统的索引中

        由于非叶子节点不存储数据,只存储关键字,所以单一节点能存储更多的元素,使得查询的IO次数更少;
        所有查询都要查找到叶子节点,查询性能稳定(叶子节点在同一层);
        所有叶子节点形成有序链表,便于范围查询。(如数据库中一般会选多条数据)

B+树与B树的区别

        B+树中只有叶子节点才存储信息,其他节点只存储关键字,而B树中每个节点都存储信息。
        B+树由于非叶子节点只存储关键字,在磁盘IO时一次能查询更多的数据,在数据相同的情况下可能会使得查询的次数更少。
        B+树中叶子结点之间是相连的,便于范围查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值