D&F学数据结构系列——B树(B-树和B+树)介绍

B树

定义:一棵B树T是具有如下性质的有根树:

1)每个节点X有以下域:

a)n[x],当前存储在X节点中的关键字数,

b)n[x]个关键字本身,以非降序存放,因此key1[x]<=key2[x]<=...<=keyn[x][x],

c)leaf[x],是一个布尔值,如果x是叶子的话,则它为TRUE,如果x为一个内节点,则为FALSE。

2)每个内节点包含n[x]+1个指向其子女的指针c1[x],c2[x],...,cn[x]+1[x]。叶节点没有子女,故它们的ci域无意义。

3)各关键字keyi[x]对存储在各子树中的关键字范围加以分隔:如果ki为存储在以以ci[x]为根的子树中的关键字,则

ki<=key1[x]<=k2<=key2[x]<=...<=keyn[x]<=keyn[x]+1

4)每个叶结点具有相同的深度,即树高h。

5)每一个结点能包含的关键字树有一个上界和下界。这些界可以用一个称作B树的最小度数的固定值t>=2表示。

a)每个非根的结点必须至少有t-1个关键字。每个非根的内结点至少有t个子女。如果树是非空的,则根结点至少包含一个                关键字。

b)每个结点可包含最多2t-1个关键字,所以一个内结点至多可以有2t个子女。我们说一个结点是满的,如果它恰好有2t-1               个关键字。

t=2时B树是最简单的。这时每个内结点有2个、3个或4个子女,亦即一棵2-3-4树。然而在实际中,通常采用很大的t。

用途:

B树是为磁盘或其它辅助存储设备而设计的一种多路平衡查找树。

为什么针对磁盘设计的数据结构不同于这对随机存储器设计的数据结构?

B树以自然的方式推广二叉查找树。如果B树的内结点X包含n[x]个关键字,则x就有n[x]+1个子女。结点X中的关键字是用来将X所处理的关键字域划分成n[x]+1个子域的分隔点,每个子域都有X中的一个子女来处理。当在一棵B树中查找某个关键字时,通过对存储在结点X中的n[x]个关键字的比较,而做出一个n[x]+1路的决定。叶节点的结构不同于内部结点的结构。

在一个典型的B树的应用中,要处理的数据量很大,因此无法一次都装入主存。B树算法将所需的页(“页”这个概念需要计算机组成原理和操作系统的知识)选择出来复制到主存中去,而后将修改过的页再写回到磁盘中去。因为在任何时刻,B树算法在主存中都只需要一定量的页数,故主存的大小并不限制可被处理的B树的大小。在B树中,一个结点的大小通常相当于一个完整的磁盘页。

对存储在磁盘上的一棵大的B树,通常采用的分支因子为50到2000,具体要取决于关键字相对于一页的大小 。选取一个大的分支因子,可以大大降低数的高度,以及寻找任意关键字时所需的磁盘存取次数。上图显示了一棵分支因子为1001、高度为2的B树,它可以存储超过10亿个关键字;尽管如此,根节点还是可以持久的保留在内存中,在这棵树中寻找某一关键字至多需两次磁盘存取!

D&F学数据结构系列——B树(B-树和B+树)介绍,布布扣,bubuko.com

时间: 2024-09-30 16:54:27

D&F学数据结构系列——B树(B-树和B+树)介绍的相关文章

D&amp;F学数据结构系列——红黑树

红黑树 定义:一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树: 1)每个结点不是红的就是黑的 2)根结点是黑的 3)每个叶结点是黑的 4)如果一个结点是红的,它的两个儿子都是黑的(即不可能有两个连续的红色结点) 5)对于每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点 性质: 这些约束确保了红黑树的关键特性: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长.结果是这个树大致上是平衡的.因为操作比如插入.删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上

D&amp;F学数据结构系列——二叉堆

二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿子在左儿子后的单元2i+1中,它的父亲在[i/2](向下取整)中. 因此,一个数据结构将由一个数组.一个代表最大值的整数.以及当前的堆的大小组成.一个典型的优先队列(priority queue)如下: 1 #ifndef _BinHeap_H 2 struct HeapStruct; 3 type

D&amp;F学数据结构系列——前驱和后继

前驱和后继 本文所述为二叉排序树的前驱和后继,如果想了解二叉排序树的概念,可以参考我的博文*** 给定一个二叉查找树中的结点,有时候要求找出在中序遍历顺序下它的后继.如果所有的关键字均不同,则某一结X点的后继就是所有(结点值)大于X的结点中最小的那个. 包含两种情况: 情况一:结点X的右子树非空,则X的后继是其右子树中最左的结点 情况二:结点X的右子树为空,设X的后继为Y.则Y是X的最低祖先结点,且Y的左儿子也是X的祖先(X自身也可以看做是X的祖先) 1 BT* TreeSuccessor(BT

重学数据结构系列之——平衡树之SB Tree(Size Blanced Tree)

平衡树 1.定义 对于每个结点,左右两个子树的高度差的绝对值不超过1,或者叫深度差不超过1 为什么会出现这样一种树呢? 假如我们按照1-n的顺序插入到二叉排序树中,那么二叉排序树就退化成了一个有序链表,效率大大降低. 2.有关概念 所有平衡树基本由以下三个特征组成: 1.自平衡条件 2.旋转操作 3.旋转的触发 平衡树通过设置合理的自平衡条件,使得二叉排序树的查找.插入等操作的性能不至于退化到 O(n)O(n),并且在进行二叉排序树的查找.插入等操作时进行判断,如果满足其中某个旋转的触发条件,则

学数据结构,是不是一定要先学离散数学

[问题的来源] 有<数据结构基础>网络课程的学员给我提问: 哈夫曼树是不是都是双分支,没有单分支的?有点不太懂这个哈夫曼树的构造过程,为什么要这样构造?只知道这样会让权值大的叶节点靠近根节点,小的叶节点远离根节点,为什么权值可以相加再比较呢? 我的答复是: 所有叶节点,都是原给定的节点:所有分支节点,度均为2,所以没有单分支. 很高兴看到你能提出这么多的为什么,然而在数据结构这门课程中,更注重是什么,怎么做的问题,也只能讲到这个层面了,为什么的事情,建议找"离散数学"教材,

算法系列15天速成——第十一天 树操作(上)

原文:算法系列15天速成--第十一天 树操作(上) 最近项目赶的紧,歇了一个星期没写博客了,趁周末继续写这个系列. 先前我们讲的都是“线性结构”,他的特征就是“一个节点最多有一个”前驱“和一个”后继“.那么我们今天讲的树会是怎样的呢? 我们可以对”线性结构“改造一下,变为”一个节点最多有一个"前驱“和”多个后继“.哈哈,这就是我们今天说的”树“. 一: 树 我们思维中的”树“就是一种枝繁叶茂的形象,那么数据结构中的”树“该是怎么样呢?对的,他是一种现实中倒立的树. 1:术语 其实树中有很多术语的

小朋友学数据结构(3):二叉树的建立和遍历

小朋友学数据结构(3):二叉树的建立和遍历 一.基本概念 BinaryTree.png 二叉树:每个结点的子结点个数不大于2的树,叫做二叉树. 根结点:最顶部的那个结点叫做根结点,根结点是所有子结点的共同祖先.比如上图中的"7"结点就是根结点. 子结点:除了根结点外的结点,都叫子结点. 叶子结点:没有子结点的结点,叫做叶子结点.比如上图中的"1"结点."5"结点和"11"结点. 二叉树的遍历,有三种: (1)前序遍历:先遍历根

跟老杨学java系列(五) JDK的安装与配置

跟老杨学java系列(五) JDK的安装与配置 提示:本节内容对于java入门是非常关键的,对于刚接触java的同学一定要认真学习,欢迎大家留言探讨技术问题.其他问题概不回复. (书接上回)上节课程我们简单介绍了java项目的开发过程及常用的开发工具,这节课我们详细讲解一下JDK的安装与配置.根据上一节的学习,我们知道编写完java代码后,需要先对java代码进行编译,然后再执行.而java程序的编译与执行都是通过JDK来完成的.所以做java开发,首先我们需要学会安装和配置JDK.下面我们就来

HDU4509-湫湫系列故事——减肥记II(线段树)

湫湫系列故事--减肥记II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2395    Accepted Submission(s): 1018 Problem Description 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动! 于是,结果显而易见- 但是没有什么能难倒高智商美女湫湫的,她决定另寻对策