二叉树与B树
二叉树的问题分析
- 二叉树需要加载到内存当中,若二叉树节点减少,没什么问题,若二叉树节点很多(1亿)就存在一下问题
- 创建二叉树时需要进行多次I/O操作,节点海量,速度有影响
- 节点海量,也会造成二叉树节点海量,降低操作速度
多叉树
- 每个节点可以允许有多个数据项和更多的节点
- 多叉树重新组织节点,减少树的高度,能对二叉树优化
B树
- B树通过重新组织节点,降低树的高度,并减少I/O次数来提高效率
- 文件系统及数据库系统利用了磁盘预读原理,将一个节点的大小设为一个页4K,每个节点只需要一个I/O可以完全载入
- 设树的度M为1024,在600亿个元素中最多只用4次I/O就可
树
2-3树
- 最简单的B树结构
- 所有叶子节点都在同一层<B树都满足>
- 二节点:空or两个节点
- 三节点:空or三个节点
- 构造2-3树:遵循以上原则,若不能满足时,就要拆(先向上拆,若上满,则拆本层,拆后依然要满足以上原则)
B B+ B*
B树
- B树的阶:节点的最多子节点个数
- B树的搜索:从root开始,对节点内有序序列进行二分查找,若命中则结束,否则进入儿子节点,重复,直到对应儿子指针为空(有可能在非叶子节点结束),或是叶子节点
- 关键字集合分布于整棵树中,即即叶子节点和非叶子节点都存放数据
B+树
- B+树是B树的变体,也是一种多路搜索树
- B+树只有达到叶子节点才会命中,其性能等价于在关键字全集做一次二分查找
- 所有关键字都出现在叶子节点的链表中,且链表中关键字恰好是有序的,不可能在非叶子节点中命中
- 非叶子节点相当于是叶子节点的索引,叶子节点相当于存储数据的数据层
- 更适合文件索引系统
B*树
- B*树是 B+树的变体,在 B+树的非根和非叶子结点再增加指向兄弟的指针
- B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为 2/3,而 B+树的块的最低使用率为的1/2
- B*树分配新结点的概率比 B+树要低,空间使用率更高