数据结构-B+tree

893 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情

一、简介

B+ 树是自平衡树的高级形式,其中所有值都存在于叶级中。

在学习 B+ 树之前要理解的一个重要概念是多级索引。在多级索引中,索引的索引创建如下图所示。它使访问数据更容易、更快捷。

B+树的特点

  1. 所有叶子都处于同一水平。
  2. 根节点至少有两个孩子。
  3. 除root外的每个节点最多可以有m孩子们,至少m/2孩子们。
  4. 每个节点最多可以包含m- 1键和至少[m/2⌉ - 1键。

B树和B+树的比较

B树

B+tree

数据指针仅出现在 B+ 树的叶节点上,而数据指针出现在 B 树的内部、叶或根节点中。

叶子在 B-tree 上不相互连接,而在 B+ 树上是相互连接的。

B+树上的操作比B树上的要快。

在 B+ 树上搜索

按照以下步骤在 B+ 顺序树中搜索数据米. 让要搜索的数据为ķ.

  1. 从根节点开始。将 k 与根节点的键进行比较[k1, k2, k3,......km- 1].
  2. 如果k < k1,到根节点的左孩子。
  3. 否则,如果k == k1, 比较ķ2. 如果k < k2, k 介于ķ1和ķ2. 所以,在左孩子中搜索ķ2.
  4. 如果k > k2, 去做k3, k4,...km-1如第 2 步和第 3 步。
  5. 重复上述步骤,直到到达叶节点。
  6. 如果叶节点中存在k,则返回true,否则返回false。

在 B+ 树上搜索示例

在下面的 B+ 树上搜索k = 45

  1. 将 k 与根节点进行比较。

  1. 由于 k > 25,去右节点查找。

  1. 将 k 与 35 进行比较。由于 k > 30,因此将 k 与 45 进行比较

  1. 由于 k ≥ 45,所以去右孩子。

  1. k 被发现。

B+ 树上的插入节点

将元素插入B+树有以下3个步骤

  1. 搜索适当的叶子节点
  2. 插入元素
  3. 平衡/拆分树

插入操作

在将元素插入 B+ 树之前,必须牢记这些属性。

  • 根节点至少有两个孩子。
  • 除root外的每个节点最多可以有m个子节点,至少m/2个子节点。
  • 每个节点最多可以包含m- 1个 键和至少⌈m/2⌉ - 1键。

案例一

  1. 如果叶子未满,则按递增顺序将元素插入叶子节点。

案例二

  1. 如果叶子已满,则将密钥按升序插入叶子节点,并按以下方式平衡树。
  2. 打破节点m/2th位置。
  3. 添加m/2th也是父节点的键。
  4. 如果父节点已满,请执行步骤 2 至 3。

插入示例

让我们通过下面的插图来理解插入操作。

要插入的元素是 5,15,25,35,45。

  1. 插入5

  1. 插入15

  1. 插入25

  1. 插入35

  1. 插入45

从 B+ 树中删除元素

删除操作

在执行以下步骤之前,必须了解有关度为m的 B+ 树的这些属性。

  1. 一个节点最多可以有 m 个子节点。
  2. 一个节点最多可以包含多个m - 1键。
  3. 一个节点应该有最少的⌈m/2⌉孩子。
  4. 一个节点(除了根节点)应该包含最少的⌈m/2⌉ - 1键。

在删除键时,我们还必须注意内部节点(即索引)中存在的键,因为这些值在 B+ 树中是冗余的。搜索要删除的密钥,然后按照以下步骤操作。

案例一

要删除的键仅存在于叶节点而不存在于索引(或内部节点)中。它有两种情况:

  1. 节点中的键数量超过了最小数量。只需删除元素。 ****从 B-tree 中删除 40

  1. 节点中有确切的最小键数。删除密钥并从直接兄弟那里借用密钥。将兄弟节点的中间键添加到父节点。从 B-tree 中删除 5

案例二

要删除的密钥也存在于内部节点中。然后我们也必须从内部节点中删除它们。这种情况有以下几种情况。

  1. 如果节点中的键数超过最小数量,只需从叶节点中删除该键,并从内部节点中删除该键。用中序后继填充内部节点中的空白区域。从 B-tree 中删除 45

  1. 如果节点中有确切的最小键数,则删除该键并从其直接兄弟(通过父级)借用一个键。用借来的键填充索引(内部节点)中创建的空白空间。

  1. 这种情况与情况 (1) 类似,但此处在直接父节点上方生成空白空间。
    删除键后,将空白空间与其兄弟合并。
    用中序后继填充祖父节点中的空白空间。从 B-tree 中删除 25
    \

案例三

在这种情况下,树的高度会缩小。这有点复杂。从下面的树中删除 55 会导致这种情况。在下面的插图中可以理解。从 B-tree 中删除 55