B+树

转载自:http://m.sohu.com/a/156886901_479559

来源:伯乐专栏作者/玻璃猫,微信公众号 - 梦见(dreamsee321)

如有好文章投稿,请点击 → 这里了解详情

之前已介绍了 B 树的原理和应用,没看过的童鞋,请点击下面的链接:

漫画:什么是 B 树?

这一次我们来介绍 B+ 树。

一个m阶的B树具有如下几个特征:

1.根结点至少有两个子女。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

一个m阶的B+树具有如下几个特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

B-树中的卫星数据(Satellite Information):

B+树中的卫星数据(Satellite Information):

需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。

第一次磁盘IO:

第二次磁盘IO:

第三次磁盘IO:

B-树的范围查找过程

自顶向下,查找到范围的下限(3):

中序遍历到元素6:

中序遍历到元素8:

中序遍历到元素9:

中序遍历到元素11,遍历结束:

B+树的范围查找过程

自顶向下,查找到范围的下限(3):

通过链表指针,遍历到元素6, 8:

通过链表指针,遍历到元素9, 11,遍历结束:

B+树的特征:

1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

B+树的优势:

1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查找到叶子节点,查询性能稳定。

3.所有叶子节点形成有序链表,便于范围查询。

漫画算法系列

### B+的数据结构及其在计算机科学中的应用 B+是一种平衡数据结构,广泛应用于计算机科学中以支持高效的插入、删除和查找操作。与B相比,B+具有独特的结构特点,使其更适合某些特定的应用场景。 #### B+的结构特点 B+的所有非叶子节点仅包含索引信息,而不存储实际数据[^2]。具体来说: - 每个节点包含多个关键字和指向子节点的指针。 - 内部节点的关键字用于引导查找路径,而叶子节点存储实际数据记录。 - 所有叶子节点通过指针相互链接,形成一个有序链表,这使得范围查询变得高效[^2]。 #### B+的优势 1. **更高的扇出**:由于内部节点存储索引信息,B+能够在相同的内存空间内存储更多的关键字,从而减少的高度,提高搜索效率[^2]。 2. **高效的范围查询**:通过连接的叶子节点,B+可以一次性遍历所有相关数据,而无需逐层递归访问[^2]。 3. **顺序访问优化**:由于数据在叶子节点中按顺序排列,B+非常适合需要频繁进行顺序访问的场景。 #### 计算机科学中的应用 B+因其高效性和稳定性,在许多领域得到了广泛应用: 1. **数据库管理系统(DBMS)**:B+是关系型数据库中索引实现的核心数据结构。例如,MySQL的InnoDB存储引擎使用B+来组织索引[^1]。 2. **文件系统**:现代文件系统(如NTFS、ext4)利用B+来管理磁盘块分配和文件元数据。 3. **分布式系统**:在分布式数据库和键值存储系统中,B+被用来构建分布式索引,支持大规模数据集的快速访问[^1]。 ```python # 示例代码:模拟简单的B+插入操作 class BPlusTreeNode: def __init__(self, is_leaf=False): self.keys = [] self.children = [] self.is_leaf = is_leaf def insert(self, key, value): if self.is_leaf: # 在叶子节点中插入数据 index = 0 while index < len(self.keys) and key > self.keys[index]: index += 1 self.keys.insert(index, key) self.children.insert(index, value) else: # 在非叶子节点中递归插入 child = self.children[self.find_child_index(key)] child.insert(key, value) if len(child.keys) > max_keys_per_node: self.split_child(self.find_child_index(key), child) def find_child_index(self, key): for i in range(len(self.keys)): if key < self.keys[i]: return i return len(self.keys) def split_child(self, index, child): # 分裂逻辑(简化版) pass # 创建根节点 root = BPlusTreeNode(is_leaf=True) root.insert(5, "Value for 5") root.insert(10, "Value for 10") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值