B数学习笔记

基本概念

  • 所谓m阶B树,即m路平衡搜索数(m>=2)
  • 内部节点各有不超过m-1个关键码,不超过m个分支
  • 内部节点的分支数也不能太少,根节点的分支>=2,其余节点>=m/2
  • 一般也用([m/2],m)树来称呼具体分支数的B树
  • B树的高度由外部节点界定,外部节点是叶节点的数值为空,其实并不存在的孩子.
  • B树的构造,一个节点指向父节点,两个节点列表,一个是本超级节点所含的n个节点,另一个是n+1个孩子节点,所以后一个列表的大小永远比前一个大一
  • 一个B树类需要记录关键码总数,阶数,根,最后访问的非空节点的位置; 方法包括查找,插入,删除;两种非法行动的解决方法,1:因插入而上溢后的分裂处理,2:因删除而下溢后的合并处理
  • 查找: 从根节点开始,在每一个超级节点列表中进行顺序查找,如果查找成功,返回,如果查找失败,找到大小包含被查找节点值的孩子节点,依次进行. 一次失败的查找必然结束于外部节点.
  • 树根节点为第0层,则叶子节点深度为h-1,树高为h. 最大数高:每个超级节点所含节点数为下限—m/2,最小树高,每个超级节点所含节点为m-1
  • 查找的时间复杂度为O(logn),底数为分支数,n为节点数
  • 插入: 先查找节点的位置,根据B树中的最后访问的非空节点的位置来确定插入位置r,然后在本节点列表r+1处插入该节点,在孩子节点列表中的r+2处插入空指针. 上溢是指,在完成插入操作后,本超级节点和分支数超出了B数的规定,即m-1和m.
  • 上溢解决–分裂 : 将超级节点列表根据中位数(偶数个取中间偏大的节点)分为三部分,0-k—1,k,k+1—m-1,然后将k位置的节点上升到其父节点,然后其余两部分分别作为k位置节点的左右孩子
  • 如果分裂后父节点发生上溢,如法炮制,再进行分裂,最坏的情况是一直上溢到根节点,如果根节点发生上溢,令提升的节点作为新的根节点,树的高度增加一,这也是B树高度增加的唯一方法
  • 插入的时间复杂度正比与B树的高度,即O(h)
  • 删除: 先查找到被删除节点的位置,再查找该节点在具体超级节点列表中的位置.如果该超级节点是叶子节点,直接删除对应节点即可;如果不是,我们需要找到比该节点值大的节点中值最小的那个对应的节点,这个节点很好找,就是被删除节点的右子树的最左端节点,一直向下寻找后继节点,直到叶子节点,将后继节点赋值给被删除节点的位置,然后删除叶子节点的后继节点和其左子树.
  • 下溢: 完成删除操作后,破坏了B树的规定
  • 下溢解决, 旋转,如果被删除节点的超级节点的兄弟节点中的节点数大于m/2,那么可以借出一个节点,但是兄弟节点中的各节点的值要不都小于其父节点,要不都大于其父节点,如果简单的借出,会破坏B树,所以将兄弟节点中最大的小于其父节点或最小的大于其父节点的节点代替父节点,父节点下降至缺少节点的超级节点.
  • 下溢解决,合并,如果被删除节点的超级节点的兄弟不存在或者没有足够的可以借出的节点,这时,下降父节点,并和其左右子树合并,合并后的超级节点最大size为m-2,然后将合并后的节点作为原父节点的前置节点的右子树,如果下降了节点的超级节点发生了下溢,如法炮制,直至根节点.

猜你喜欢

转载自blog.csdn.net/qq_36865108/article/details/84948038