查找算法(IV) B-树和B+树
B-树
B-树的结构
B-树是一种平衡的多路查找树。它的结构如下:
一棵m阶的B-树,或为空树,或为满足下列条件的m叉树:
1.树中每个结点至多有m棵子树;
2.若根结点不是叶子结点,则至少有两棵子树;
3.除根之外的所有非终端结点至少有[m/2向上取整]棵子树;
4.所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
5.所有的非终端结点中包含下列信息数据
(n, A0, K1, A1, K2, A2, …, Kn, An)
(实际上在B_树的每个结点中还应包含n个指向每个关键字的记录的指针。)
其中n为关键字的个数, [m/2向下取整]<=n<=m-1,n+1为子树个数;
Ki(i=1,…,n)为关键字,且按升序排列;
Ai(i=0,1,…,n)为指向子树根结点的指针,且指针Ai-1所指子树中的所有结点的关键字均小于Ki(i=1,…,n)。An所指子树中所有结点的关键字均大于Kn.
其基本思想是利用关键字把记录区间切成小段,然后被切分的小段分别放进对应的子树里。
注意:非叶子结点的关键字个数=指向儿子的指针个数-1
在B-树上进行查找
在B-树上进行查找的过程和二叉排序树的查找类似,是一个顺指针查找结点和在结点的关键字中进行查找交叉进行的过程。
B-树主要用作文件的索引,因此它的查找往往涉及外存的存取。
两种基本操作:
1.在B_树中找结点;(磁盘上进行)
2.在结点中找关键字。(内存中进行)
因为在磁盘上进行一次查找比在内存中进行一次查找耗费时间多得多,因此,在磁盘上进行查找的次数、即待查关键字所在结点在B_树上的层次数,是决定效率的主要因素。
B+树
B+树是应文件系统所需而出的一种B-树的变形树,严格来说,它已经不是树了。
一棵m阶的B+树和B_树的差异如下:
1.在B-树中,每个结点含有n个关键字和n+1棵子树,而在B+树中,每个结点含有n个关键字和n棵子树,即每个关键字对应一棵子树。
2.在B-树中,每个结点(除根结点外)中的关键字个数n的取值范围是:[m/2向下取整]<=n<=m-1,而在B+树中,每个结点(除树根结点外)中的关键字个数n的取值范围是:[m/2向上取整]<=n<=m,树根结点的关键字个数的取值范围是1<=n<=m.
3. B+树中所有叶子结点包含了全部关键字及指向对应记录的指针,且所有叶子结点按关键字从小到大的顺序依次链接。
4. B+树中所有非叶子结点仅起到索引的作用,即结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。
在B+树上进行查找
通常在B+树上有两个头指针,一个指向根结点,用于从根结点起对树进行插入、删除和查找等操作,另一个指向关键字最小的叶子结点,用于从最小关键字起进行顺序查找和处理每一个叶子结点中的关键字及记录。
在B+树上进行查找时,若非终端结点上的关键字等于给定值,并不终止,而是继续向下直到叶子结点。
因此,在B+树,不论查找成功与否,每次查找都是走了一条从根到叶子结点的路径。