`
chakey
  • 浏览: 364354 次
  • 性别: Icon_minigender_1
  • 来自: 水星
社区版块
存档分类
最新评论

[转载]【数据结构】B-Tree, B+Tree, B*树介绍

    博客分类:
  • Java
阅读更多

[转载]【数据结构】B-Tree, B+Tree, B*树介绍

 

转载链接:http://blog.sina.com.cn/s/blog_6776884e0100ohvr.html

【摘要】

      最近在看Mysql的存储引擎中索引的优化,神马是索引,支持啥索引.全是浮云,目前Mysql的MyISAM和InnoDB都支持B-Tree索引,InnoDB还支持B+Tree索引,Memory还支持Hash.今天从最基础的学起,学习了解BTree,B-Tree和B+Tree。

【主题】

  • B-Tree 介绍
  • B-Tree 特性搜索插入等
  • B+Tree 介绍
  • B*Tree 介绍

【内容】

1. B-Tree 介绍

     1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树,其定义如下:

一棵m阶的B树满足下列条件:

  • 树中每个结点至多有m个孩子;
  • 除根结点和叶子结点外,其它每个结点至少有m/2个孩子;
  • 若根结点不是叶子结点,则至少有2个孩子;
  • 所有叶子结点(失败节点)都出现在同一层,叶子结点不包含任何关键字信息;
  • 所有非终端结点中包含下列信息数据 ( n, A0 , K1 , A1 , K2 , A2 , … , Kn , An ),其中: Ki (i=1,…,n)为关键字,且Ki < Ki+1 , Ai (i=0,…,n)为指向子树根结点的指针, n为关键字的个数
  • 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;

     在B树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。B树中的一个包含n个关键字,n+1个指针的结点的一般形式为:   (n,P0,K1,P1,K2,P2,…,Kn,Pn)其中,Ki为关键字,K1 <K2 <… <Kn,   Pi   是指向包括Ki到Ki+1之间的关键字的子树的指针。

btree1

-- 图1 B-tree示意图

2. B-Tree特性

2.1 B-Tree 特性

  • 关键字集合分布在整颗树中;
  • 任何一个关键字出现且只出现在一个结点中;
  • 搜索有可能在非叶子结点结束;
  • 其搜索性能等价于在关键字全集内做一次二分查找;
  • 自动层次控制;

2.2 B-Tree搜索原理

B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;因此,B-Tree的查找过程是一个顺指针查找结点和在结点的关键字中进行查找的交叉进行的过程。

b树

b树2

-- 图2 高度与关键码的计算过程

2.3 B-Tree 插入

     B-树是从空树起,逐个插入关键码而生成的。

     在B-树,每个非失败结点的关键码个数都在[ m/2 -1, m-1]之间。插入在某个叶结点开始。如果在关键码插入后结点中的关键码个数超出了上界 m-1,则结点需要“分裂”,否则可以直接插入。

     实现结点“分裂”的原则是:

     设结点 A 中已经有 m-1 个关键码,当再插入一个关键码后结点中的状态为( m, A0, K1, A1, K2, A2, ……, Km, Am)其中 Ki < Ki+1, 1 =< m

这时必须把结点 p 分裂成两个结点 p 和 q,它们包含的信息分别为:

     结点 p:( m/2 -1, A0, K1, A1, ……, Km/2 -1, Am/2 -1)

     结点 q:(m - m/2, Am/2, Km/2+1, Am/2+1, ……, Km, Am)

     位于中间的关键码 Km/2 与指向新结点 q 的指针形成一个二元组 ( Km/2, q ),插入到这两个结点的双亲结点中去。

3. B+Tree

3.1 B+Tree定义

     B+树可以看作是B树的一种变形,在实现文件索引结构方面比B树使用得更普遍。

一棵 m 阶B+树可以定义如下:

  • 树中每个非叶结点最多有 m 棵子树;
  • 根结点 (非叶结点) 至少有 2 棵子树。除根结点外, 其它的非叶结点至少有 ém/2ù 棵子树;有 n 棵子树的非叶结点有 n-1 个关键码。
  • 所有叶结点都处于同一层次上,包含了全部关键码及指向相应数据对象存放地址的指针,且叶结点本身按关键码从小到大顺序链接;
  • 每个叶结点中的子树棵数 n 可以多于 m,可以少于 m,视关键码字节数及对象地址指针字节数而定。
  • 若设结点可容纳最大关键码数为 m1,则指向对象的地址指针也有 m1 个。
  • 结点中的子树棵数 n 应满足 n 属于[m1/2, m1]
  • 若根结点同时又是叶结点,则结点格式同叶结点。
  • 所有的非叶结点可以看成是索引部分,结点中关键码 Ki 与指向子树的指针 Pi 构成对子树 (即下一层索引块) 的索引项 ( Ki, Pi ),Ki 是子树中最小的关键码。
  • 特别地,子树指针 P0 所指子树上所有关键码均小于 K1。结点格式同B树。
  • 叶结点中存放的是对实际数据对象的索引。
  • 在B+树中有两个头指针:一个指向B+树的根结点,一个指向关键码最小的叶结点。

B+Tree与B-Tree区别

  1. 非叶子结点的子树指针与关键字个数相同;
  2. 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);
  3. 为所有叶子结点增加一个链指针;
  4. 所有关键字都在叶子结点出现;

对B+树进行两种搜索运算

  • 循叶结点链顺序搜索
  • 另一种是从根结点开始,进行自顶向下,直至叶结点的随机搜索。

alt

-- 图3 B+Tree示意图

3.2 B+Tree特性

     B+Tree的搜索与B-Tree也基本相同,区别是B+Tree只有达到叶子结点才命中(B-Tree可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+Tree的特性

  • 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
  • 不可能在非叶子结点命中;
  • 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
  • 更适合文件索引系统

4. B*Tree

4.1 B*Tree

     B*Tree是B+树的变体,在B+Tree的非根和非叶子结点再增加指向兄弟的指针;

alt

-- 图4 B*Tree示意图

     B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2);

     B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

     B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

     所以,B*树分配新结点的概率比B+树要低,空间使用率更高;

【结束】

自我总结:

  • B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
  • B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
  • B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

参考资料:

分享到:
评论

相关推荐

    B-tree--BP-tree--B--tree--R-tree.rar_B+_R-Tree_b+tree_btree转换为rt

    在《B-tree--BP-tree--B--tree--R-tree.rar》这个压缩包中,包含了对这四种数据结构的详细解释和比较,是学习和理解这些概念的重要参考资料。通过阅读《B-tree》、《B+ tree》、《B tree》和《R tree》这四个文档,...

    B-tree与B+tree简介

    动态查找树主要有三种类型:二叉查找树(Binary Search Tree)、平衡二叉查找树(Balanced Binary Search Tree)和B-tree/B+-tree。这些树结构的查找时间复杂度为O(log2N),与树的深度相关。但是,在大规模数据存储...

    B树、B-树、B+树、B树++、R-tree总结

    B树、B-树、B+树以及B树++和R树是数据库和文件系统中常用的高效数据结构,它们主要用于实现磁盘或其他外部存储的查找。这些数据结构的设计目标是减少磁盘I/O操作,提高数据访问速度,因为磁盘读写速度远慢于内存。 ...

    数据结构BTree B-Tree B+Tree B*Tree 的特征说明

    改变 B 树结构(插入与删除结点)不需要移动大段的内存数据 * 平衡问题: 1. B 树在经过多次插入与删除后,有可能导致不同的结构 2. 需要考虑尽可能让 B 树保持左图的结构,避免右图的结构 二、B-树(Multi-way ...

    B树、B-树、B+树、B*树

    #### 三、B+树 (B+-Tree) **定义**: - B+树是在B-树的基础上发展起来的一种多路搜索树。 - 除了保留B-树的特点外,B+树为所有叶子节点添加了链指针,使得所有关键字仅存在于叶子节点中。 - 非叶子节点用作叶子节点...

    08 B-Tree.rar

    B-Tree(B树),一种自平衡的树数据结构,广泛应用于数据库和文件系统中,以优化对大量数据的访问效率。B-Tree是多路搜索树,每个节点可以有多个子节点,通常2到32个之间。其设计目标是为了在磁盘或其他慢速存储设备...

    B-Tree B-Tree

    B-Tree(B树),是一种自平衡的树数据结构,它能够保持数据排序,常用于数据库和文件系统中。B-Tree的主要特性是节点可以拥有多个子节点,通常远多于二叉树。这种数据结构允许高效地在大型数据集上进行查找、插入和...

    el-tree-selected-tree

    `el-tree`通过`data`属性接收一个包含树结构的数据数组,每个对象包含`label`(节点文本)、`children`(子节点数组)和其他自定义属性。我们可以利用`props`属性来指定各个属性的映射,例如`label`对应节点的显示...

    The Ubiquitous B-Tree

    本文讨论的主题是B树(B-tree),一种被广泛应用于文件组织的标准结构。作者Douglas Comer通过本文回顾了B树的基本概念、成功的原因,并深入探讨了其主要变体——B+树的特点和应用场景。 #### B树概述 B树是一种自...

    索引基础——B-Tree、B+Tree、红黑树、BTree数据结构1

    B-Tree,B+Tree,红黑树以及B*Tree都是数据结构中常见的索引类型,主要用于数据库和文件系统的索引构建,以提高数据检索效率。它们都是多路搜索树,区别在于节点的分配方式、搜索策略以及平衡机制。 首先,B-Tree是...

    B_Tree的C语言实现与分析

    **B-树(B Tree)**是一种自平衡的树数据结构,它能够保持数据排序,适合作为数据库和文件系统的索引结构。B-树的主要特点是每个节点可以有多个子节点,这使得它能高效地处理大数据量的存储。在C语言中实现B-树,...

    mysql索引与树结构(索引简介、索引用法详解、B-Tree索引结构、索引导致的问题).docx

    - **按数据结构分类**: B-Tree索引、哈希索引、R-Tree索引等。 - **B-Tree索引**: 最常见的索引结构之一,适用于大多数场景。 - **哈希索引**: 适用于查找操作,但在更新时可能会出现瓶颈。 - **R-Tree索引**: ...

    B.rar_B-树索引_B树_b tree_b tree java_java B-Tree

    1. **B-树结构**:B-树是一种自平衡的多路搜索树,每个节点可以有多个子节点,这些子节点通常称为分支或指针。B-树的每个节点包含一个键值集合和对应的子树指针集合。 2. **度**:B-树的度指的是每个节点最多能有的...

    kd-tree的基本教程PDF

    - **定义**:KD-Tree(K-Dimensional Tree)是一种用于多维空间中的数据结构,特别适用于快速查找和组织点集合,如最近邻搜索等操作。 - **结构**:KD-Tree是一种二叉树结构,其中每个节点代表一个k维空间中的点,...

    小议如何删除数据结构B-tree的关键字.pdf

    在探讨如何在数据结构B-tree中删除关键字之前,我们先来了解B-tree的基本概念和特性。B-tree(B树),是一种平衡的多路查找树,主要用于文件系统管理中进行有效的存取和索引记录操作。它通过简单的记录管理和B-tree...

    decision-tree-js, ID3决策树的小型JavaScript实现.zip

    decision-tree-js, ID3决策树的小型JavaScript实现 decision-tree-js决策树与随机森林分类器算法的小型JavaScript实现算法。随机森林演示在线演示:http://fiddle.jshell.net/7WsMf/show/light/ 决策树演示在线演示...

    BTree,B-Tree,B+Tree,BTree都是什么.doc

    B树的搜索性能逼近二分查找,但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销。但是,B树在经过多次插入与删除后,有可能导致不同的结构, 右边...

    B树、B-树、B+树、B树

    通过对B树、B-树、B+树以及它们在SQL Server中的应用进行深入探讨,可以看出这些数据结构对于提高数据库系统的性能至关重要。正确理解和使用这些索引类型可以帮助开发者有效地管理和查询大量数据,从而提升应用程序...

    B-树与B+树(重要)1

    B-树和B+树是两种重要的数据结构,主要用于数据库和文件系统的索引,它们能够高效地处理大量的数据,尤其适合磁盘等慢速存储介质。这两种数据结构都是多路平衡查找树,能够保持数据的有序性,同时通过减少磁盘I/O...

    B-树 B+树 源代码 C++ 数据结构

    B-树和B+树是两种高效的数据结构,主要用于数据库和文件系统的索引,以优化大容量数据的检索效率。本项目提供的源代码是C++实现的B-树和B+树,有助于学习者深入理解这两种数据结构的内部机制。 首先,B-树...

Global site tag (gtag.js) - Google Analytics