B树与B+树学习笔记

一般情况下,我们所讨论的数据结构,都是处理在内存中的数据。因此考虑的都是内存中的运算时间复杂度。

如果我们要操作的数据集非常大,达到内存已经没办法处理了怎么办呢?如数据库中的上千万条记录的数据表。硬盘中的上万个文件等。在这种情况下,对数据的处理需要不断从硬盘灯存储设备中调入或调出内存页面(页面调度算法)。

一旦涉及到这样的外部存储设备。关于时间复杂度的计算就会发生变化,访问该集合元素的时间已经不仅仅是寻找该元素所需比较次数的函数,我们必须考虑对硬盘等外部存储设备的访问时间以及将会对该设备做出多少次单独访问。在这样的一个场景中,为了要在一个拥有几十万个文件的磁盘中查找一个文本文件,你设计的算法需要读取磁盘上万次还是读取几十次即可,这是由本质区别的。为了降低对外存设备的访问次数,我们需要新的数据结构来处理这种问题。

这里我们引入多路查找树的概念。其每一个节点的孩子数可以多于两个,且每一个节点处都可以存储多个元素。由于它是查找树,所有元素之间存在某种特定的排序关系。下面我们介绍一下B树和B+树。

B树是一种平衡的多路查找树,节点最大的孩子数目称为B树的阶。

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

(1)如果根节点不是叶节点,则至少有两棵子树。

(2)每一个非根的分支节点都有k-1个元素和k个孩子,其中[m/2]<=k<=m。每一个叶子结点n都有k-1个元素,其中[m/2]<=k<=m

(3)所有叶子结点都位于同一层次。

在B树上查找的过程是一个顺指针查找节点和在节点中查找关键字的交叉过程。比如说,我们要查找数字7,首先从外存读取得到根节点3,5,8三个元素,发现7不在当中,但是7在5与8之间,因此可以通过指针读取外村的6,7节点,查找到所需要的元素。

如果内存与外存交换数据次数频繁,会造成时间效率的瓶颈,那么B树结构怎么就可以做到减少次数呢。

我们的外存,比如硬盘,是将所有的信息分割成相等大小的页面,每次磁盘读写的都是一个或多个完整的页面,对于一个硬盘来说,一页的长度可能是211到214个字节。

再一个典型的B树应用中,要处理的硬盘数据量很大,因此无法一次全部装入内存,因此我们会对B树进行调整,使得B树的阶数与硬盘存储的页面大小相匹配。比如一个B树的阶为1001(1个节点包含1000个关键字作为子树),高度为2,他可以存储超过10亿个关键字,我们只要让根节点持久的保持在内存中,那么在这棵树中,寻找某一个关键字之多需要两次硬盘的读取即可。

通过这种方式,在有限内存的情况下,每一次磁盘的访问我们都可以获得最大数量的数据。由于B树每结点可以具有比二叉树多得多的元素,所以与二叉树的操作不同,他们减少了必须访问结点和数据块的数量,从而提高了性能。可以说,B树的数据结构就是为内外村的数据交互准备的。

前面讲了B树的诸多好处,其实他还是有缺陷的,对于树形结构,我们可以通过中序遍历来顺序查找树中的元素,这一切都是在内存中进行的。

可在B树中,我们往返于每个节点之间也就意味着,我们必须得在硬盘的页面之间进行多次访问,如下图所示(阴影部分表示节点内元素个数):我们希望遍历这棵B树,假设每个节点都属于硬盘的不同页面,我们为了中序遍历所有元素,页面2->页面1->页面3->页面1->页面4->页面1->页面5.而且我们每次经过节点遍历是,都会对节点中的元素进行一次遍历,这样会非常糟糕,所以我们需要进行相应的改进。

为了能够解决所有元素遍历等基本问题,我们在原有的B树结构基础上,加上了新的元素组织方式,这就是B+树,B+树是应文件系统所需而出的一种B树的变形树,注意严格意义上讲,它其实已经不是一棵树了。在B树中,每一个元素在该树中只出现一次,有可能在叶子节点上,也有可能在分支节点上,而在B+树中,出现在分支节点的元素会被当做他们在该分支节点位置的中序后继者(叶子结点)中再次列出,另外,每一个叶子结点都会保存一个指向后一叶子结点的指针。

如下图所示,就是一个B+树事宜,灰色关键字是根节点中的关键字在叶子结点中再次列出,并且所有叶子结点都连接在一起。

一棵m阶B+树和m阶B树的差异在于:

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

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

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

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

如果我们是需要从最小关键字进行顺序超找,我们可以从最左侧的叶子结点出发,不经过分支节点,按照链表中的查询方式进行查找。

猜你喜欢

转载自blog.csdn.net/q_all_is_well/article/details/82320869