B-Tree(B-树)
基本搜索结构
以上结构适合用于数据量不是很大的情况,如果数据量非常大,一次性无法加载到内存中,使用上述结构就不是很方便
B-树概念
一种适合外查找的树,它是一种平衡的多叉树,称为B树(B-树")。一棵M阶(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质:
- 根节点至少有两个孩子
- 每个非根节点至少有M/2(上取整)个孩子,至多有M个孩子
- 每个非根节点至少有M/2-1(上取整)个关键字,至多有M-1个关键字,并且以升序排列
- key[i]和key[i+1]之间的孩子节点的值介于key[i]、key[i+1]之间
- 所有的叶子节点都在同一层
B-树的插入分析
假设M = 3. 即三叉树,每个节点中存储两个数据,两个数据可以将区间分割成三个部分,因此节点应该有三个孩子,节点的结构如下:
注意:孩子永远比数据多一个。
用序列{53, 139, 75, 49, 145}构建B树的过程如下:
插入75的过程如下:
1.按照插入排序思想将75插入到序列中
2.插入后该节点不满足情况,需要对该节点进行分裂
分裂节点
1.找到节点数据域的中间位置
2.给一个新节点,将中间位置的数据搬移到新节点中
3.将中间位置数据搬移到父节点中
4.将节点连接好
1.找到该元素的插入位置(索要插入节点pCur)
2.按照插入排序思想将节点插入到该节点(pCur)的合适位置3.
检测该节点是否满足B树的性质
满足: 插入结束
不满足:对节点进行分裂
插入过程:
- 如果树为空,直接插入新节点中,该节点为树的根节点
- 树非空,找待插入元素在树中的插入位置(注意:找到的插入节点位置一定在叶子节点中)
- 检测是否找到插入位置(假设树中的key唯一,即该元素已经存在时则不插入)
- 按照插入排序的思想将该元素插入到找到的节点中
- 检测该节点是否满足B-树的性质:即该节点中的元素个数是否等于M,如果小于则满足
- 如果插入后节点不满足B树的性质,需要对该节点进行分裂:
申请新节点
找到该节点的中间位置
将该节点中间位置右侧的元素以及其孩子搬移到新节点中
将中间位置元素以及新节点往该节点的双亲节点中插入,即继续4 - 如果向上已经分裂到根节点的位置,插入结束