B树
m阶B树节点元素数
- 最大分支数m,因此所有节点最大元素数m-1
- 叶子节点无分支,特殊情况根节点就是叶子节点
- 根节点可以有2 ~ m个分支,因此可以有1 ~ m-1个元素
- 非根非叶子节点最小元素数目是刚分裂后的数目,即(m-1)/2,向下取整(我习惯这样理解,也有Math.ceil(m/2)-1之类的写法)
插入
- 插入元素的节点元素数不饱和,直接插入(插入都发生在叶子节点,与删除不一样)
- 元素数饱和,插入溢出(节点中有m个元素),分裂(m个元素取中位数,作为上一层的元素,剩下左右元素作为该元素的左右分支。该操作递归进行,直到满足所有节点元素都不溢出)
删除
- 〇如果发生在非叶节点,转到①,否则转到②;
- ①子元素替换:用后继或者前驱覆盖要删除元素,然后在后继或前驱所在的子支中删除该后继或前驱,该操作递归进行,直到删除操作发生在叶子节点,转到②;
- ②删除叶子节点元素,转到③;
- ③调整:各节点满足要求,结束。否则考虑不满足条件的节点,如果兄弟节点元素够多,转到④,否则转到⑤;
- ④旋转:把和兄弟节点共同的父元素A拉到这个节点成为新子元素B’,兄弟节点中距离最近的元素C上升成为新父元素A’,C的单侧分支成为B’的单侧分支,转到③;
- ⑤合并:把和兄弟节点共同的父元素A以及兄弟节点所有的元素合并成为新节点,转到③。
B+树
- 与B树相似性很大,不同在于节点的每一个元素有一个分支节点,而这个元素存有分支节点的最大或最小值信息,同时分支节点存有该元素
- 不同于B树key-value同时存储,在B+树中非叶节点仅仅存放key,而叶子节点才存放key-value
- 所有的叶子节点连接成为一个链表,极大方便了范围遍历
优势
- 因为非叶节点只存key不存value,可以显著增加一个节点的元素树,增大B+树的阶数,随之减小树高,减少查询次数
- 每一个元素的value都在叶子节点,且根到叶子节点深度相同,因此对所有元素查询次数相同,稳定
- 有叶子链表存在,范围遍历很方便
可视化yyds
B-Tree Visualization (usfca.edu)
B+ Tree Visualization (usfca.edu)
上面的B+树可视化非叶节点的元素数比分支数少1,这点与B树相同,但原理还是B+的原理。