数据结构-B+tree

简介: B+ 树是 B 树的扩展,它允许高效的插入、删除和搜索操作。在 B 树中,键和记录都可以存储在内部节点和叶节点中。而在 B+ 树中,记录(数据)只能存储在叶子节点上,而内部节点只能存储键值。B+树的叶子节点以单链表的形式链接在一起,使搜索查询更加高效。B+树用于存储无法存储在主存储器中的大量数据。由于主存的大小总是有限的,B+树的内部节点(访问记录的键)存储在主存中,而叶节点存储在辅助内存中。

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

参考文章

  1. https://www.programiz.com/dsa/b-plus-tree
相关文章
|
11月前
|
存储 算法 数据库
Python高级数据结构——树(Tree)
Python高级数据结构——树(Tree)
449 1
|
存储 算法 Linux
打破常规,Linux内核新的数据结构上场maple tree(下)
打破常规,Linux内核新的数据结构上场maple tree
|
存储 分布式数据库 C语言
【初阶数据结构】树(tree)的基本概念——C语言
【初阶数据结构】树(tree)的基本概念——C语言
|
存储
数据结构之二叉查找树(Binary Search Tree)和红黑树(Red Black Tree)
二叉查找树又可以称之为 : 二叉搜索树 , 二叉排序树 , 它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势 , 下图中这棵树,就是一棵典型的二叉查找树
149 1
|
4月前
|
存储 算法 Python
Python数据结构新视角:Trie树与Suffix Tree的相爱相杀,你站哪边?
【7月更文挑战第20天】在编程领域,Trie树(前缀树)与Suffix Tree(后缀树)犹如双星,各有专长。Trie树高效检索字符串集合,擅长前缀匹配,适用于自动补全和拼写检查;Suffix Tree则管理字符串所有后缀,加速子串查询,解最长公共前缀和重复子串难题。两者在不同场景发光发热,Trie树于快速响应的自动完成胜出,Suffix Tree则在基因序列分析和文本模式识别中独领风骚。抉择之间,应用场景与需求成关键,恰如剑客选剑,唯理解本质方能制胜。
34 1
|
4月前
|
存储 数据处理 开发者
告别繁琐查找!Python高级数据结构Trie树与Suffix Tree,让数据处理更轻松!
【7月更文挑战第19天】Python的Trie树优化字符串搜索,利用前缀减少无效操作,提升效率;Suffix Tree则高效处理后缀问题,尤其适用于文本搜索与生物信息学。虽构建复杂,但能加速后缀查询。掌握这两种数据结构,能有效应对大规模数据挑战,简化处理流程,提升开发效率。
109 0
|
5月前
|
存储 算法 测试技术
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
数据结构学习记录——树习题-Complete Binary Search Tree(题目描述、输入输出示例、数据结构的选择、核心算法、计算左子树的规模)
77 1
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
45 1
|
6月前
|
存储 关系型数据库 MySQL
数据结构---B+Tree
数据结构---B+Tree
48 1
|
6月前
|
存储 算法 关系型数据库
MySQL索引 索引数据结构B+Tree、分类及使用、回表查询
MySQL索引 索引数据结构B+Tree、分类及使用、回表查询
273 0

热门文章

最新文章