多路查找树开篇

转载地址:http://blog.csdn.net/dazhong159/article/details/7964245

前言(自己加的)

动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树
(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。 
但是咱们有面对这样一个实际问题:就是大规模数据存储中,实现索引查询这样一
个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下(为什么会出现这种情况,待会在外部存储器-磁盘中有所解释),那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。 
这样我们就提出了一个新的查找树结构——多路查找树。根据平衡二叉树的启发,
自然就想到平衡多路查找树结构,也就是这篇文章所要阐述的第一个主题B~tree(B树结构)。

有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。而事实上是,B-tree就是指的B树

1、引言

        以前我们所讨论的数据结构,处理数据都是在内存中。假如我们所要操作的数据集非常大,大到内存无法处理了怎么办?如数据库上千万记录的数据表、硬盘中上万个文件等。在这种情况下,对数据的处理需要不断的从硬盘等存储设备中调入或者调出内存页面。而过多的进行IO读写,显然会降低系统的效率。为了降低对外存的访问次数,我们就需要新的数据结构来处理这样的问题。

2、2-3树

        每个节点都具有2个孩子(称之为2节点)或者3个孩子(称之为3节点)。

        一个2节点包含一个元素和两个孩子(或没有孩子)。

        一个3节点包含两个元素和三个孩子(或没有孩子)。

3、2-3-4树

        每个节点都具有2个孩子(称之为2节点)或者3个孩子(称之为3节点)或者4个孩子(称之为4节点)。

        一个2节点包含一个元素和两个孩子(或没有孩子)。

        一个3节点包含两个元素和三个孩子(或没有孩子)。

        一个4节点包含三个元素和四个孩子(或没有孩子)。

4、B树

        B树是一种多路查找树,2-3树和2-3-4树都是B树的特例。节点最大的孩子数目称为B树的阶,因此2-3树是3阶B树,2-3-4树是4阶B树 。

        一个m阶的B树具有如下性质:

        1)如果根节点不是叶子节点,则其子树个数范围为[2,m];

        2)分支节点子树范个数围为[m/2,m];

        3)所有叶子节点在同一层次;

        4)所有分支节点包含下列信息:关键字个数n,关键字k1,...,kn,指向子树根结点的指针A0,...,An。

        如果内存与外存交换数据次数频繁,会造成时间上的瓶颈,那么B树结构是怎么做到减少次数呢?

        我们的外存,比如硬盘,是将所有信息分割成相等大小的页面,每次硬盘读写的都是一个或多个完整的页面。在一个典型的B树应用中,要处理的硬盘数据量很大,因此无法一次全部装入内存。因此我们会对B树进行调整,使得B树的阶数(或节点的元素)与硬盘存储的面页面大小相匹配。比如说一颗B树的阶为1001(即一个节点包含1000个关键字),高度为2,他可以存储超过10亿个关键字,我们只要让根节点持久的保留在内存中,那么在这棵树上,寻找某一个关键字至多需要两次硬盘的读取。通过这种方式,在有限内存的情况下,每一次磁盘的访问我们都可以获得最大量的数据。由于B树每个节点可以具有比二叉树多得多的元素,所以与二叉树相比,它们减少了必须访问节点和数据块的数量,从而提高了性能。可以说B树的数据结构就是为内外存的数据交互准备的。

5、B+树

        对于树结构来说,我们都可以通过中序遍历来顺序查找树中的元素,这一切都是在内存中进行。可是B树结构中,我们往返于每个节点之间也就意味着,我们必须在硬盘的页面之间进行多次访问。

        为了能够解决所有元素遍历等基本问题,我们在原有B树结构基础上,加上了新的元素组织方式,这就是B+树。

        B+树不同与B-树的地方:

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

        2)所有的叶子节点包含全部关键信息,及指向含这些关键字记录的指针

        3)所有分支结点可以看成是索引,节点中仅含有其子树中的最大(或最小)关键字

        这样的数据结构最大的好处就是,如果是要随机查找,我们就从根节点出发,与B树的查找方式相同,只不过即使在分支节点找到了待查找的关键字,它也直是用来索引的,不能提供实际记录的访问,还是需要到达包含此关键字的终端节点。

        如果我们是要从最小关键字从小到大进行顺序查找,我们就可以从最左侧的叶子节点出发,不经过分支节点,而是沿着指向下一个叶子节点的指针遍历所有的关键字。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值