B树与B+树
B树
B树的定义
一个m阶的B树,就是每一个非叶子节点拥有不超过m个子孩子,也可以定义为非叶子节点最多有m个查找路径(当m=2就是二叉,m=3就是三叉)
真实得到数据集存储在叶子节点和非叶子结点上。B树需要符合下面的一些限制:
1、从根节点到叶子节点的每一条路径都拥有相同的长度
2、如果一个节点拥有n个孩子,那么他就拥有n-1个元素
3、除了根节点和叶子节点,每个非叶子结点(中间的节点)都最少拥有ceil(m/2)上限个子节点
4、关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2);(因为关键字数量等于n-1,n>=ceil(m/2))
5、根节点如果不是一个叶子节点,就至少有两个孩子
排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;
B树的查询
如上图我要从上图中找到E字母,查找流程如下
(1)获取根节点的关键字进行比较,当前根节点关键字为M,E<M(26个字母顺序),所以往找到指向左边的子节点(二分法规则,左小右大,左边放小于当前节点值的子节点、右边放大于当前节点值的子节点);
(2)拿到关键字D和G,D<E<G 所以直接找到D和G中间的节点;
(3)拿到E和F,因为E=E 所以直接返回关键字和指针信息(如果树结构里面没有包含所要查找的节点则返回null);
B树的插入
定义一个5阶树(平衡5路查找树;),现在我们要把3、8、31、11、23、29、50、28 这些数字构建出一个5阶树出来;
遵循规则:
(1)节点拆分规则:当前是要组成一个5路查找树,那么此时m=5,关键字数必须<=5-1(这里关键字数>4就要进行节点拆分);
(2)排序规则:满足节点本身比左边节点大,比右边节点小的排序规则;
- 先插入 3、8、31、11
再插入23、29(当等于5时,先排序,将中间的元素进行分裂)
再插入50、28
下面是一个4阶B树的生成