B/B+树

1.内存与磁盘

        内存快,磁盘慢(寻址慢)

        内存断电后数据消失,磁盘持久存久

        正因为磁盘的寻址慢,那么红黑树由于寻址的次数过多,所以不适合

        B/B+树降低层高,加快寻址

        一个块4K(linux默认),Btree有1024叉,4G的内存空间两次寻址就能找到

2.B-树的性质

        一颗M阶B树T,满足以下条件

        1. 每个结点至多拥有M棵子树

        2. 根结点至少拥有两颗子树

        3. 除了根结点以外,其余每个分支结点至少拥有M/2课子树

        4. 所有的叶结点都在同一层上

        5. 有k棵子树的分支结点则存在k-1个关键字,关键字按照递增顺序进行排序

        6. 关键字数量满足ceil(M/2)-1 <= n <= M-1

3.B-树数据结构定义

        

typedef int KEY_VALUE;
struct btree_node{
    KEY_VALUE *keys;
    //指针的数组而不是二维数组
    struct btree_node **childrens;//malloc 好处在于sizeof不会特别大
    int num;
    bool isleaf;//是否叶子节点
                //事实上int和bool是一样的,因为边界对齐
};

struct btree{
    struct btree_node *root;
};

4.B-树的分裂

        添加超过上限的节点时,两种情况

        a.只有根节点时,一分三

        B/B+树_第1张图片

        b.其他情况一分二(小技巧是选偶数的M便于分裂,将中间的直接提上去就好了)

B/B+树_第2张图片

5.B树添加

        两个步骤,1.找到对应的节点2.对节点的key进行对比,找到合适的位置

        插入的位置是叶子节点

6.B树删除

        1.idx子树数量== ceil(m-2)-1,[idx - 1],[idx + 1]

                A.借位

                        a.从idx-1借位

                        b.从idx+1借位(哪个大于ceil(m/2) -1借哪个)

                B.合并

        2.大于最小限度直接删除即可

        步骤:第一步:找到对应的子树,第二步:按照上述方法调整

你可能感兴趣的:(b树)