zoukankan      html  css  js  c++  java
  • B+树概念学习

    转载自 从B树、B+树、B*树谈到R 树

    1.用阶定义的B树

        B 树又叫平衡多路查找树。一棵m阶的非空B 树的特性如下:

     (注:切勿简单的认为一棵m阶的B树是m叉树,虽然存在四叉树,八叉树,KD树,及vp/R树/R*树/R+树/X树/M树/线段树/希尔伯特R树/优先R树等空间划分树,但与B树完全不等同)

      1. 树中每个结点最多含有m个子树(m ≥ 2);
      2. 除根结点和叶子结点外,其它每个结点至少有┌m / 2┐个子树;
      3. 若根结点不是叶子结点,则至少有2个子树。若树非空,则根至少有1个关键字,故若根不是叶子,则它至少有2棵子树
      4. 所有叶子结点都出现在同一层,叶子节点没有孩子和指向孩子的指针,叶子节点不包含关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null)。这里的叶子结点情况可以看下图

                     

        如图,最底层的叶子结点没有存储任何信息

    每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
           a)   Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。 
           b)   Pi为指向子树的根结点,且指针P(i-1)指向子树中所有关键字小于Ki,大于K(i-1)的一组结点。 
           c)   即每个每个非根的内部结点至少应有┌m / 2┐-1个关键字,至多有m-1个关键字。
         d)   因为每个内部结点的度数正好是关键字总数加1,故每个非根的内部结点至少有┌m / 2┐棵子树,至多有m棵子树。
     
    例1:
     
        上图即是一棵B树,一棵关键字为英语中辅音字母的B树,现在要从树中查找字母R(包含n[x]个关键字的内结点x,x有n[x]+1个子结点(也就是说,一个内结点x若含有n[x]个关键字,那么x将含有n[x]+1个子结点)。所有的叶结点(不是真正的叶子结点,是叶子结点上一层的结点)都处于相同的深度,浅色结点为查找字母R时要检查的结点)
    相信,从上图你能轻易的看到,一个内结点x若含有n[x]个关键字,那么x将含有n[x]+1个子女。如含有2个关键字D H的内结点有3个子女,而含有3个关键字Q T X的内结点有4个子女。
     
     
    例2:一棵包含24个英文字母的5阶B树的存储结构图。

     说明:
         按照定义,在5阶B树里,根结点中的关键字数目可以是1~4(整棵树只有1个关键字),子树数可以是2~5;其它的结点中关键字数目可以是2~4【 ┌m / 2┐-1 ≤ n ≤ m-1】,若该结点不是叶子,则它可以有3~5棵子树【┌m / 2┐ ≤ n ≤ m】。注意子树和关键字是不一样的

    网站:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.3.2.2.htm

    2.B树的高度

        若B树某一非叶子节点包含N个关键字,则此非叶子节点含有N+1个孩子结点,而所有的叶子结点都在第K层,我们可以得出:
    1. 因为根至少有两个孩子,因此第2层至少有两个结点。
    2. 除根和叶子外,其它结点至少有┌m/2┐个孩子,
    3. 因此在第3层至少有2*┌m/2┐个结点,
    4. 在第4层至少有2*(┌m/2┐^2)个结点,
    5. 以此类推
    6. 在第K层至少有2*(┌m/2┐^(k-2) )个结点,于是有: N+1 ≥ 2*┌m/2┐^(k-2);
    7. 考虑第K层的结点个数为N+1,因为2*(┌m/2┐^(k-2))≤N+1,也就是L层的最少结点数刚好达到N+1个,即: k≤ log┌m/2┐((N+1)/2 )+2;
     
      所以
    • 当B树包含N个关键字时,B树的最大高度为k-1(因为计算B树高度时,叶结点所在层不计算在内),即:k - 1 = log┌m/2┐((N+1)/2 )+1
     
      这个B树的高度公式从侧面显示了B树的查找效率是相当高的。
    一棵含有N个总关键字数的m阶的B树的最大高度是多少?答曰:log┌m/2┐((N+1)/2 )+1(上面中关于m阶B树的第1点特性已经提到:树中每个结点含有最多含有m个孩子,即m满足:┌m / 2┐<=m<=m。而树中每个结点含孩子数越少,树的高度则越大,故如此)。
    3.B+-tree

    B+-tree:是应文件系统所需而产生的一种B-tree的变形树。

    一棵m阶的B+树和m阶的B树的异同点在于:

          1.有n棵子树的结点中含有n-1 个关键字; (此处颇有争议,B+树到底是与B 树n棵子树有n-1个关键字 保持一致,还是不一致:B+树n棵子树的结点中含有n个关键字,待后续查证。暂先提供两个参考链接:①wikipedia http://en.wikipedia.org/wiki/B%2B_tree#Overview;②http://hedengcheng.com/?p=525。)

          2.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)

          3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)

    简单点说:

    1).非叶子结点的子树指针与关键字个数相同;

    2).非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

    3).为所有叶子结点增加一个链指针;

    4).所有关键字都在叶子结点出现

     

    挺有用的网址:http://www.sohu.com/a/156886901_479559

    B+的特性:

    1).所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

    2).不可能在非叶子结点命中;

    3).非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

    4).更适合文件索引系统;

    B+树的优势:

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

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

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

    磁盘中B+树索引: 

    局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,(在许多操作系统中,页得大小通常为4k)

    数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,(由于节点中有两个数组,所以地址连续)。

    MYSQL-B+TREE索引原理

    B+树实现

    【算法】B+树的研读及实现(2)---java版核心代码

    B+树实现磁盘存储

    可视化

    https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

  • 相关阅读:
    WampServer Mysql配置
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 前10名
  • 原文地址:https://www.cnblogs.com/34fj/p/6225293.html
Copyright © 2011-2022 走看看