这是我参与「第五届青训营 」笔记创作活动的第15天
今天更新一篇有关树的数据结构的内容. 在前两篇文章中,我们简单介绍了二叉树和二叉平衡树,了解了二叉平衡树是如何通过节点的左旋和右旋来保持树的平衡并保持节点的关系不变的.本期我们来学习更深入的一种树的类型: B树,也叫B-树.
我们知道,SQL数据库存储引擎中经常利用树的结构来在磁盘上存储数据.为什么要这样做呢?主要是因为数据库中的数据规模非常大,导致数据必须部分或全部地保存在磁盘中.由于磁盘的IO速度较慢,每一次读写的开销都非常可观,所以,为了减少对磁盘的IO数量,存储引擎引入了树结构类保存数据. 数据库对磁盘的读写是以块为单位的.我们将树的每一个节点作为一个块,由于树具有的层次性,查找和访问任意一个数据的时间复杂度只有 O(h) 其中 h 是树的高度. 如果我们限制树的高度,是不是就能减少SQL数据库对磁盘的读写呢? 这就引入了B树的概念. B树相较于二叉树,每个节点的子节点不再限制为2个,而是可以拥有多个节点.这样的话,树的高度就可以从 log_2(N) 降低到 log_x(N) ,其中 x 为每个节点的平均子节点数目.这就是B树的基本原理.
B树的特点
- 所有叶子节点都出现在同一层上,并且不存储信息.
- 每个节点包含的关键字个数有上界和下界. 用一个称为最小度数的固定整数来表示这些界.
- 一个包含 x 个关键字的节点有 x+1 个孩子.
- 一个节点中的所有关键字都是升序排列,两个关键字之间的所有子节点的关键字范围都在 (k_1, k_2) 之间
总结: B树就是将二叉树中多个节点结合成一个节点,同时保证节点中和节点间数据的有序性.这样就可以通过在单个节点中包含多个数据来减少磁盘IO同时不失查找速度.
和二叉树一样,B树也有中序遍历. 也是从最左边的子节点开始,递归地打印最左边的子节点,然后从左到右,从上到下对剩余节点重复相同的过程.