7.7.1 外查找之 B-tree、B+tree 认识

前面的BST、AVL都是用作内部查找的数据结构,即被查找的数据集不大,可以放在内存中。本节7.7 所介绍的查找树,用作外部查找所查数据放在外存中。

本节内容,主要推荐几篇大神的博客,后面作一些转载,并总结主要内容,没有代码实践,就没有必要自己写一堆东西了,前辈们写的都很牛。

1. July 大神的文章

从B树、B+树、B*树谈到R 树

2. 简明扼要的文章

BTree和B+Tree详解

快速理解平衡二叉树、B-tree、B+tree、B*tree

下面就对主要知识进行概括。

 

B-Tree

B树,B-树都是它,又称为多路平衡查找树,是一种组织和维护外存文件系统非常有效的数据结构。

B-Tree中所有结点的孩子结点的最大值称为B-Tree的阶,用m表示,若查找效率考虑,要求m≥3。B-Tree的以下5条性质,需要深刻理解:

  1. 树中每个结点最多含有m个孩子(m>=2);
  2. 除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子(其中ceil(x)是一个取上限的函数);
  3. 若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);
  4. 所有叶子结点都出现在同一层(即树中所有结点平衡因子都是0),叶子结点不包含任何关键字信息(可以看做是外部接点或查询失败的接点,实际上这些结点不存在,指向这些结点的指针都为null);
  5. 每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:
  •  Ki (i=1...n)为关键字,且关键字按顺序升序排序K(i-1)< Ki。
  •  Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。 
  •  关键字的个数n必须满足: [ceil(m / 2)-1]<= n <= m-1。
     

8394323_13074405906V6Q.jpg

能够理解这几个性质,理解B-Tree 的查找操作,基本就合格了。其次是 熟悉结点插入和删除的操作,我们看其他的博客了解了即可。

B+-Tree

即B+树,是应文件系统所需而产生的一种B-tree的变形树,广泛应用。更适合实际应用中操作系统的文件索引和数据库索引(比如MYSQL数据),关于其如何适合文件索引和数据库索引,需要我们认识深刻其特性并结合IO操作等知识,在July的博客里介绍十分详细,不再重复。

1.有n棵子树的结点中含有n个关键字; (而B树是n棵子树有n-1个关键字)

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

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

B*Tree

B*-tree是B+-tree的变体,在B+树的基础上(所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针),B*树中非根和非叶子结点再增加指向兄弟的指针;B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)。


简单看了这几个外查找的二叉查找树,从B树、B+树、B*树总体来看它们都是采用二分法和树深度平衡策略来提升查找数据的速度;而不同点是通过IO从磁盘读取数据的原理进行一步步的演变,使节点的空间更合理的运用起来,从而使树的层级减少达到快速查找数据的目的。

引用July博客的总结:

B树:有序数组+平衡多叉树;

B+树:有序数组链表+平衡多叉树;

B*树:一棵丰满的B+树。

    在大规模数据存储的文件系统中,B~tree系列数据结构,起着很重要的作用,对于存储不同的数据,节点相关的信息也是有所不同,这里根据自己的理解,画的一个查找以职工号为关键字,职工号为38的记录的简单示意图。(这里假设每个物理块容纳3个索引,磁盘的I/O操作的基本单位是块(block),磁盘访问很费时,采用B+树有效的减少了访问磁盘的次数。)

对于像MySQL,DB2,Oracle等数据库中的索引结构得有较深入的了解才行,建议去找一些B 树相关的开源代码研究。

B+树还有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值