实例数据
B树(B-Tree)
B树(B-Tree)是一种自平衡的树数据结构,能够保持数据有序,允许搜索、顺序访问、插入和删除操作都在对数时间内完成。B树与二叉树不同,每个节点可以拥有多于两个子节点,这使得B树在存储系统(如数据库和文件系统)中特别有用,因为它们可以减少定位记录时所需的磁盘I/O操作次数。
多用于磁盘
B树的基本特性:
所有值都是按键(key)自动排序的:每个节点中的关键字都是按升序排列的。
根节点至少有两个子节点(除非它是叶子节点):对于非根非叶的节点,至少含有
m/2
个子节点,其中m
是树的最小度数(每个节点的最大子节点数)。所有叶子节点都位于同一层:这是B树保持平衡的一种方式。
每个非叶子节点包含n个关键字和n+1个子指针:其中
m/2 - 1 <= n <= m-1
。这些关键字作为子树中所有关键字的分隔值。每个子节点的关键字范围:对于任意节点,其所有子节点的关键字都位于该节点的两个关键字之间(对于第一个和最后一个子节点,分别是小于和大于该节点的第一个和最后一个关键字)。
B树中的每个节点都包含以下信息:
- 关键字(Key):这些是关键字值,对应于表中的主键或索引键。在B树中,这些关键字是按顺序排列的,以便进行高效的查找、插入和删除操作。
- 值(Value):与每个关键字相关联的数据或记录。这些值存储在节点中,与关键字一一对应。在数据库索引的上下文中,value通常包含除主键以外的所有列的数据。
- 指针(Pointer):指向子节点的指针。这些指针用于在树中导航,以便在查找、插入或删除操作期间能够遍历到正确的节点
B树的操作:
搜索:从根节点开始,比较节点中的关键字,根据比较结果移动到相应的子节点,直到找到所需的关键字或到达叶子节点。
插入:首先,像在二叉搜索树中一样找到新关键字应该插入的位置。然后,如果该节点已满(即包含
m-1
个关键字),则将其分裂为两个节点,并将中间的关键字提升到父节点中。如果父节点也满了,则递归地继续这个过程,直到根节点也可能被分裂,这时树的高度会增加。删除:找到要删除的关键字,并用其子树中的关键字(通常是前驱或后继)来替换它。然后,从子树中删除该关键字。如果删除导致节点中的关键字数量少于
m/2 - 1
,则可能需要从相邻的兄弟节点借关键字,或者与相邻的兄弟节点合并,并可能递归地向上调整树的结构。总结:
B树的一个节点包含多个key和value
示例5阶B树:
B+树
B+树是一种常用的树数据结构,属于平衡多路查找树的一种。它主要用于数据库和操作系统的文件系统中,以提高数据的检索效率。以下是对B+树的详细解析:
一、基本结构
B+树是一个n叉排序树,每个节点通常有多个孩子。一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上子节点的节点。B+树的特点是所有数据都保存在叶子节点中,而非叶子节点只保存关键字用作索引。
二、优势
- 数据稳定有序:B+树能够保持数据稳定有序,使得插入与修改操作拥有较稳定的对数时间复杂度。
- 优化磁盘读写:B+树的结构特别适合磁盘存取。由于非叶子节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率。同时,由于叶子节点形成了一个有序链表,可以很方便地实现范围查询。
- 减少I/O操作:B+树的所有叶子节点都位于同一层,这使得每次查找的路径长度相同,且每次磁盘I/O操作可以获取更多的关键字,从而减少I/O次数。
- 高效的范围查询:由于叶子节点形成了有序链表,B+树在进行范围查询时非常高效。
三、节点结构
- 根节点:可能是一个叶子节点,也可能是一个包含两个或两个以上子节点的节点。
- 内部节点:每个内部节点包含多个关键字和指向子节点的指针。关键字用于索引,但不保存数据。内部节点可以看作是索引部分,节点中仅含其子树(或根节点)中的最大(或最小)关键字。
- 叶子节点:包含所有的数据记录和指向下一个叶子节点的指针。叶子节点本身按关键字的大小自小而大顺序排列,并且形成了一个有序链表。
四、操作原理
- 插入操作:B+树的插入操作在叶子节点上进行。如果插入后叶子节点的关键字数目超过最大限制,则会发生分裂,并将新的关键字提升到父节点中。
- 删除操作:B+树的删除操作也仅在叶子节点进行。如果删除操作导致叶子节点的关键字数目过少,则可能与相邻的兄弟节点合并,或者从父节点中借取关键字。
五、应用场景
B+树因其高效的数据检索和范围查询能力,被广泛应用于数据库系统和文件系统中
特点:
B+树的非叶子节点仅具有索引作用(简单来说就是非叶子节点只存key不存value)
B+树的所有叶子节点构成一个有序链表
实例5阶B+树
总结:
B+树的非叶子节点只存储key值,做索引使用,一页能存储更多的key的值,树的高度越低
B+树的叶子结点相连,对整颗树的遍历只需要一次遍历叶子结点即可 区间查找
B树:每个节点都包含key和value,根据key值查找value的时候,只要找到key,就能立马找到value
B树一般用做磁盘 B+树一般用作数据库