前言-数据结构
数据结构是需要反复咀嚼,不管什么时候都可以重中获取现在在开发中的遇到的问题答案。
B-树
介绍
插入操作
-
B-树(「m - 1 )- 1 <= 结点中的关键字个数 <= m - 1, 并且整个B-树可以看成全部由关键字组成的树,每次插入一个关键字不是在树中添加一个叶子结点,而是在查找的过程中找到叶子结点所在层的上一层(叶子结点是记录,上一层是关键字最后一层),在某个结点中添加一个关键字,若结点的关键字个数不超过m-1,则插入完成,否则产生结点的分裂。
-
例子
- 3阶B-,{m-1 到「m - 1 / 2} 最多是三个子树,至少是二个子树(m - 1) = 2 ,所以一个结点最多有2个关键字
- 此时26 插入,超过m-1 = 2个关键字,就必须分裂,此时30是中间位置,就上位到24同层级
- 插入26
- 步骤1:找到插入26的结点,d结点,d结点关键字多项
- 步骤2: d结点的中间结点上位,双亲结点
- 步骤3: d结点分裂(中间结点上位)分裂时26及其前后指针保留在d中,37及其前后指针创建到d中,30及指向d‘的指针插入到双亲结点b中,如果30的插入导致b中关键字个数等于3,则按同样方法分裂
- 插入 85
- 最后插入7
- 3阶B-,{m-1 到「m - 1 / 2} 最多是三个子树,至少是二个子树(m - 1) = 2 ,所以一个结点最多有2个关键字
删除操作
- 假设删除关键字不在最下层,设关键字为K,则可以用Ai指向子树的最小关键字Ai-1指向子树的最大关键字替换Ki,再删去这个关键字即可,而该关键字必定在最下层,所以只需要删除最下层结点关键字的情况。假设删除结点在最下层,删除后仍然满足B-树定义则删除结束,否则要进行合并结点的操作,合并可能自下向上层层进行。
- 例子
- 直接删除12
- 删除50,因为最少是结点至少是1,所以要接兄弟的
- 删除53,那e结点的61和90就减少到两个指针,所以60降到它的子树
- 情形3:删除若兄弟不够,则高降且合并(拉回来)删除 上图关键字(53)被删关键字(53)所在节点(f)和其相邻的兄弟结点(g)中的关键字数目均等于「m/27 1(1)假设该节点有右兄弟(g),在删去关键字(53)后,他所在结点(f)中剩余的关键字和指针加上双亲结点(e)中的关键字(61)-起合并到右兄弟结点(g)中。
- 情形3:删除若兄弟不够,则高降且合并(拉回来)删除 上图关键字(53)被删关键字(53)所在节点(f)和其相邻的兄弟结点(g)中的关键字数目均等于「m/27 1(1)假设该节点有右兄弟(g),在删去关键字(53)后,他所在结点(f)中剩余的关键字和指针加上双亲结点(e)中的关键字(61)-起合并到右兄弟结点(g)中。
- 删除37 情形3 拉下来合并
B+树
-
操作: B+树的查找、插入、删除
在B+树上进行随机查找、插入和删除的过程基本上与B树类似。 -
查找:若非终端结点上的关键字等于给定值,并不终止, 而是继续向下直到叶子结点。因此,在B+树种,不管查找成功与否,每次查找都是走一条从根 节点到叶结点的路径。B+树查找的分析类似于B- 树。
-
插入:仅在叶子结点上进行插入,当结点中的关键字个数大于m时要分裂成两个结点,他们所含关键字的个数分别为[(m+1)/2]和[(m+1)/2 ]:并且,他们的双亲结点应同时包含这两个结点中的最大关键字。
-
删除: B+树的删除也仅在叶子结点进行,当叶子结点中最大关键字被删除时,其在非终端结点中的值可以作为一个“分界关键字”存在。若因删除而使结点中关键字的个数少于[m/2]时,其他兄弟结点的合并过程亦和B树类似。