B树和B+树

一个好用的在线画数据结构和算法图的网址:

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

B树的性质

一个m阶的b树有如下的性质(m阶意味该树的某个节点最多有m个孩子)

1.根节点至少有两个孩子。

2.中间节点至少有ceil(m/2)个孩子,最多有m个孩子。

3.叶子节点有k-1个元素。其中m/2<=k<=m.

4.所有的叶子节点都是在同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划分。

B树又称b-树,是多路平衡查找树。它的每个节点不光包含了记录的key值,还包含了该记录的data值,例如对用于数据库的话,data就可能是该条数据库记录在磁盘中的逻辑地址。

B树的查找

B树的查找过程从根节点开始查找。

如果查找key值等于该节点上的某个key值,查找成功。

如果查找key值在该该节点某两个key值的范围内,在这两个key值对应的子节点中查找。

B树的插入

B树的插入过程:

1.先查找到插入key的叶子节点,按照key值的排列插入。

2.如果该节点的元素数量小于等于m-1,则插入完成。否则进行第3步。

3.此时该节点的元素数量等于m,找到中间的元素,将中间的元素插入父节点中,然后吧剩余的元素分为左右两个节点,插入父节点的元素的左子树指向左部分,插入父节点的元素的右子树指向由部分。当前的节点指向父节点,进行第2步。

例如3阶的b树

插入15

插入19后

插入18

B树的删除

B树的删除过程:

(1)查找到需要删除记录的位置,如果该位置在非叶子节点上,则删除该记录后用该记录的后继记录代替该记录,并删除后继记录,直到删除到叶子节点。

(2)如果被删除的叶子节点的元素个数大于等于m/2时,删除成功。否则执行第(3)步。

(3)如果被删除的叶子节点的兄弟节点的元素个数大于m/2时(左右兄弟节点都可以),将父节点的元素给被删除的叶子节点,然后用兄弟节点的元素补给父节点。如果兄弟节点的元素个数等于m/2时,将父节点的元素和兄弟节点以及被删除节点合并为一个节点,然后父节点删除的位置指向新合并的节点。当前节点为父节点,执行第(2)步。

例如:一个5阶的b树

删除60

删除70

删除90

 

B+树的性质

1.b+树的节点的元素数比孩子数少1.

2.b+树的节点分为两种类型:内部节点和叶子节点。根节点既可以当作内部节点也可以是叶子节点。根节点最少可以有一个元素。‘

3.所有的数据都保存在叶子节点上,内部节点只当作索引。

4.内部节点的key都按大小有序排序,左树的所有元素都小于该元素,右树的所有元素都大于等于该元素。

5.所有叶子节点都是使用指针自大到小顺序链接的。

B+树的插入

(1)如果原来是空树,将该记录插入空树中,此时根节点既是叶子节点又是内部节点。

(2)针对叶子节点的插入:在该树的叶子节点中找到需要插入的位置插入,如果插入的节点元素数小于等于m-1,插入结束。否则,将该节点分为左右两部分,左部分包含前m/2个元素,右部分包含剩余元素。将第m/2+1个元素的key进位到父节点上,进位到父节点的元素的左指针指向左部分,右指针指向右部分,当前节点为父节点,执行第(3)步。

(3)针对内部节点的插入:插入key后,如果元素个数小于等于m-1,插入结束。否则,将该节点分为左右两个索引节点,左节点包含(m-1)/2个元素,右节点包含m-(m+1)/2个元素,把第ceil(m/2)个元素进位到父节点。进位元素左指针指向左部分,右指针指向右部分。当前节点为父节点,重复步骤(3)。

例如:3阶的b+树

插入65

插入63

插入64

 

 

B+树的删除

B+树删除的过程:(1)找到需要删除的记录,它在叶子节点上,删除后,如果该叶子节点上的元素个数大于等于ceil(m-1/2)的话,删除成功,否则执行步骤(2)。

(2)如果删除节点的兄弟节点元素个数大于ceil(m-1/2),借用兄弟节点的记录补充到删除节点,并修改父节点的key值。

(3)如果兄弟节点没有多余的话,将删除节点和兄弟节点合并为一个节点,并将父节点原来的两个key元素删除掉右边一个。执行步骤(4)。

(4)如果父节点的元素个数大于等于ceil(m-1/2),则删除成功,否则,执行步骤(5)。

(5)如果兄弟节点有多余,则把兄弟节点上移,把父节点下移,删除成功。否则执行下一步。

(6)当前节点和父节点和兄弟节点合并为一个节点。当前节点为父节点,执行步骤(4)。

例如:一个五阶的b+树:

删除40

删除75

删除55

删除60

  

B+树和B树的区别

1.b+树的data都存在叶子节点里,内部节点只是存索引,由于索引所占空间小,所以内部节点可以存大量索引,降低了树的高度。减少了磁盘IO的次数。提高了效率。

2.b+树相比B树的查询更加稳定,每次查询都要到叶子节点,而b树最快在根节点查到数据,最慢在叶子节点查到数据。

3.由于b+树所有的叶子节点都链接在一起,可以根据key的值进行范围查询。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值