目录
B-树
m阶B-树满足:
- 树中每个节点最多有m个孩子
- 除根结点和叶子节点外,其他每个节点至少有[ceil(m/2)]个孩子 (ceil为取上限的函数)
- 除根结点之外的节点的关键字的个数n必须满足:[ceil(m/2)-1] <= n <= m-1
B-树的插入:
- 如果叶子节点空间足够多,则直接插入在叶子节点的左边或者右边
- 如果空间满了以致没有足够的空间去添加新的元素,则需要将该节点进行“分裂”,将一半数量的关键字元素分裂到新的其相邻右节点中,中间元素上移到父结点中。
- 此外,如果在上述中间关键字上移到父节点的过程中,导致根节点空间满了,那么根节点也要进行分裂操作,这样原来根节点中的中间元素向上移动到新的根节点中,导致树的高度增加一层。
5阶B-树形成过程:CNGAHEKQMMFWLTZDPRXYS
B-树的删除:
首先查找B树中要删除的元素,若元素存在,则进行删除,删除该元素后要判断该元素是否有左右孩子节点
- 如果有,则上移孩子节点中的相近元素(左孩子中最右边的节点或者右孩子中最左边的节点)到父节点中去。
- 如果没有,直接删除
删除元素然后进行元素移动之后,如果节点关键字数目不能满足条件(小于ceil(m/2)-1),则需要看其相邻的兄弟节点是否丰满(关键字个数大于ceil(m/2)-1)
- 如果丰满,则向父节点借一个元素来满足
- 如果其相邻兄弟刚脱贫,即借了之后其节点数目小于ceil(m/2)-1,则该节点与相邻的某一兄弟节点进行“合并”成一个节点。
删除前边的B-树中的H、T、R、E
B-树的优势:
- 更少的磁盘I/O
- 更快的搜索算法
B-树的应用:(系统中的数据搜索)数据量非常大->磁盘会给数据创建索引 ->给数据进行排序,加速搜索
- 文件索引系统中的应用
- 数据库的索引
B+树
B+树是B-树的一种变形树,m阶的B+树和m阶的B-树的区别:
- 所有叶子节点包含全部关键字信息以及指向含有这些关键字记录的指针,且叶子节点中关键字进行有序链接
- 非叶子节点相当于是叶子节点的索引,叶子节点相当于是存储数据的数据层
- B+树所有叶子节点被连接成有序链表结构,因此做整表遍历和区间查找非常容易
B+树如图所示:
B+树比B树更适合操作系统的文件索引和数据库索引的原因:
- B+树的磁盘读写代价更低。同样的索引数据存储成B-树需要更多的节点,存储成B+树节点数量会更少,因为B+树一个节点放的关键字更多,B-树不仅要放关键字还要放数据地址,所以B+树的层数会更低一点,一个节点包含索引项更多,搜索起来更加方便。
- B+树的查询效率更加稳定。任何关键字的查找必须走一条从根节点到叶子节点的路,所以关键字查询的路径长度相同,导致每一个数据的查询效率相当。
B*树
B*树是B+树的变体,在B+树的非根和非叶子节点再增加指向兄弟节点的指针。B*树定义了叶子节点关键字个数至少为(2/3)*m。代替了B+树的1/2
B*树的分裂:当一个节点满时,如果它的下一个兄弟节点未满,那么将一部分数据移动到兄弟节点中,再在原节点中插入关键字。如果兄弟满了,则增加新节点,各拷贝原节点和兄弟节点的1/3数据。
B*树分裂新节点的概率比B+树要低,空间使用率更高,在B+树的基础上为非叶子节点也增加链表指针,将节点的最低利用率从1/2提高到2/3。