zoukankan      html  css  js  c++  java
  • B树和B+树

    B(Balanced)树(注意:B树就是很多人口中所说的B-树,这是不专业的,不要区分两者)和B+树是用来对操作系统的文件索引和数据库索引而提出的数据结构,通俗点讲,两者都是有序数组+平衡多叉树。

    B树的定义:一棵m阶的B树,或为空树,或为满足下列特性的m叉树

    (1)树中的每个结点至多有m棵子树;

    (2)若根结点不是叶子结点,则至少有2棵子树;

    (3)除根结点之外的非终端结点至少有m/2(取上整)棵子树;

    (4)所有的非终端结点,最多包含n个关键字,m/2(取上整)-1 <= n <=m-1;

    (5)所有的叶子结点都出现在同一层次上,且不带任何信息。(可以看做是外部结点或查询失败的结点,实际上这些结点不存在,指向这些结点的指针为空);

    B树的查询要点:待查关键字所在结点在B树上的层次,是决定B树查询效率的首要因素。有个问题,含N个关键字的m阶B树的最大深度是多少?

    根据定义,第一层至少有1个结点,第二层2个,第三次至少2(m/2(取上整)),依次类推,第L+1层至少2(m/2(取上整))L-1.而L+1层为叶子结点。若m阶B树中有N个关键字,那么就有N+1叶子结点。

    因此N+1 ≥ 2*(m/2(取上整))L-1,计算出L即可。

     画个例子(注:网上找的):

    2、B+树:它是应文件系统所需而产生的数据结构。直接上图理解:

    它与B树的区别主要在于:

    (1)有n棵子树的结点中包含n个关键字;

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

    (3)所有非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中最大(或最小)关键字。

    B+树查找:在查找过程中,若非终端结点上的关键字等于给定值,并不终止,而是继续向下直到叶子结点。因此,不管查找什么,每一次查找都会走一条从根结点到叶子结点的路径。

    那么为什么B+树比B树更适合用于文件系统索引和数据库索引:

    个人见解,有2方面原因:

    (1)B+树遍历效率高,因为只要遍历它的叶子结点即可。

    (2)B+树搜索都要走一条从根结点到叶子结点的路径,查找更稳定。

  • 相关阅读:
    Android+Eclipse+Java:在“正在启动 CrazySnake”期间发生了内部错误, java.lang.NullPointerException
    ActivityManager: Warning: Activity not started, its current task has been brought to the front 的的问题
    CLR via C#(15)--String,熟悉而又陌生
    CLR via C#(14)-可空值类型,关于?和??的故事
    CLR via C#(13)-浅谈事件
    CLR via C#(12)-委托Delegate
    CLR via C#(11)-无参属性、有参数属性(索引器)
    CLR via C#(10)-参数
    CLR via C#(09)-扩展方法
    CLR via C#(08)-操作符
  • 原文地址:https://www.cnblogs.com/qiuhaojie/p/7060984.html
Copyright © 2011-2022 走看看