B树定义
完整定义如下:如果B树的度为M
- 根了节点至少有两个子节点
- 其它节点至少有M/2个子节点。
- 每个节点最多有M-1个key,并且以升序排列
- 位于M-1和M key的子节点的值位于M-1 和M key对应的Value之间 (key 反映了value的大小)
B-tree树即B树。B即Balanced平衡,因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树。(只有B树,和后面B树变种B+树,在没有别的。我之前一直以为有个B减树。)
B 树可以看作是对2-3查找树的一种扩展,即他允许每个节点最多有M-1个子节点。同时,B树具有2-3 查找树自平衡的性质。
M = 3就是一个2-3 查找树吗?
是的。B树是2-3查找树的扩展,2-3查找树是一个M=3时的B树。具体的可以参考下图是一个M=3的B树。
(图片来自互联网)
B+ 树定义
B+树是对B树的一种变形树,它与B树的差异在于:
- 有k个子结点的结点必然有k个关键码;
- 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
- 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。
在变形时,在子节点(默认为右子节点)保留一个那个将要提升的node(包含数据),然后新建与此node相同但是不含数据的node作为父节点,并向上合并node。
B树在存储中的应用
文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:
每次新建一个节点的同时,直接申请一个页的空间( 512或者1024),这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。如,将B树的度M设置为1024,这样在前面的例子中,600亿个元素中只需要小于4次查找即可定位到某一存储位置。
参考链接:
浅谈算法和数据结构: 十 平衡查找树之B树 - yycoding (注意,此链接中B+树的演示应该存在错误)