B树、B-树、B+树的知识点(联系磁盘)

对于B开头的树,学了几遍忘几遍,最终在面试的时候遇到了,不会,面试挂了。所以今天好好打开数据结构的课本,看书+网上的资料,终于发现,课本上讲的特别清楚明白,当初怎么就学不会呢,还是不够用心啊。这里参考了http://blog.csdn.net/dazhong159/article/details/7963846这篇博客的内容,加上一些书上的内容,放到这里,供大家理解。
1、B树:二叉搜索树
B树就是二叉搜索树,所有非叶子节点至多拥有两个儿子,所有节点存储一个关键字,非叶子节点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树。实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉搜索树”。
二叉搜索树的插入删除搜索操作的平均时间复杂性为O(lgN),最坏的时间复杂性为O(n)。
而红黑树和AVL树的查找、插入、删除操作都能在对是时间内完成(平均和最坏情况)。两种结构的实际运行性能也很接近,AVL树一般会稍微快一些。
AVL树每次插入最多需要一次旋转,每次删除最多需要O(lgN)次旋转;而红黑树对于每个插入删除操作,都需要执行一次旋转。
2、外存储器——磁盘
计算机存储设备一般分为两种:内存储器和外存储器。内存存取速度快,但容量小,价格昂贵,而且不能长期保存数据(在不通电的情况下数据会消失)。
外存储器——磁盘是一种直接存取的存储设备(DASD)。它是以存取时间变化不大为特征的。可以直接存取任何字符组,且容量大,速度较其他外存设备更快。
2.1 磁盘的构造
磁盘是一个扁平的圆盘,盘面上有许多称为磁道的圆圈,数据就记录在这些磁道上。磁道可以是单片的,也可以是由若干盘片组成的盘组,每一盘片上有两个面。如下图所示的6片盘组为例,除去最顶端和最低端的外侧面不存储数据之外,一共有10个面可以用来保存信息。
《B树、B-树、B+树的知识点(联系磁盘)》
当磁盘驱动器执行读写功能时,盘片装在一个主轴上,并绕主轴高速旋转,当磁道在读写头下通过时,就可以进行数据读写了。
一般磁盘分为固定头盘和活动头盘,固定头盘的每一个磁道上都有独立的磁头,它是固定不动的,专门负责这一磁道上数据的读写。
活动头盘的磁头是可移动的。每一个盘面上只有一个磁头(磁头是双向的,因此正反盘面都能读写)。它可以从该面的一个磁道移动到另一个磁道。所有磁头都装在同一个动臂上,因此不同盘面上的所有磁头都是同时移动的。当盘片绕主轴旋转的时候,磁头和旋转的盘片形成一个圆柱体。各个盘面上半径相同的磁道组成了一个圆柱面,我们称为柱面。因此,柱面的个数也就是盘面上的磁道数。
2.2 磁盘的读写原理和效率
磁盘上的数据必须用一个三维地址唯一标识:柱面号、盘面号、块号。读写磁盘上某一指定数据需要下面三个步骤:
(1)移动臂根据柱面号使磁头移动到需要的柱面上,这一过程被称为定位或查找。
(2)所有磁头都定位好以后,根据盘面号来确定指定盘面上的磁道。
(3)盘面确定以后,盘片开始旋转,将指定块号的磁道段移动至磁头下。
经过上面三个步骤,指定的数据存储位置就被找到。这时就可以开始读写操作了。访问某一具体信息,由三部分时间组成:查找时间,这部分代价最高;等待时间,也就是找到固定盘块所用的时间;传输时间。
磁盘读取数据是以盘块为基本单位的。位于同一盘快中的所有数据都能被一次性的全部读取出来。而磁盘IO代价主要花费在查找时间上,因此我们应该尽量将相关的信息存放在同一盘块、同一磁道中,或者至少放在同一柱面或相邻柱面上,以求在读写信息时尽量减少磁头来回移动的次数,避免过多的查找时间。
所以在大规模数据存储方面,大量数据存储在外存磁盘中,而在外存磁盘中读取写入数据时,先要定位到磁盘中的某块,如何有效地查找磁盘中的数据,需要一种高效合理的外存数据解雇,就是下面所要重点阐述的B-树结构,以及相关变种结构:B+树和B*树。
3、 B-树
性质:B-树是一种多路搜索树(并不是二叉的);
1、定义任意非叶子节点最多只有M个儿子,且M>2;
2、根节点的儿子数为[2,M];
3、除根节点以外的非叶子节点的儿子数为[M/2,M];
4、每个节点至少存放M/2-1(取上整)和至多M-1个关键字(至少2个关键字)
5、非叶子结点的关键字个数=指向儿子的指针个数-1;
6、非叶子节点的关键字递增
7、非叶子节点的指针:与关键字的关系
8、所有叶子节点位于同一层。
搜索:从根节点开始,对节点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子节点;重复,知道所对应的儿子指针为空或是已经是叶子节点;
1、关键字集合分布在整棵树中;
2、任何一个关键字出现且只出现在一个节点中;
3、搜索有可能在非叶子节点结束;
4、其搜索性能等价于在关键字全集内做一次二分查找;
5、自动层次控制,所有外部节点都位于同一层上;
6、由于限制了除根节点以外的非叶子节点,至少含有M/2个儿子,确保了节点的至少利用率,其最底层搜索性能为lgN;
7、B-树的性能总是等价于二分查找(与M值无关),没有B树平衡问题;
8、由于M/2的限制,在插入节点时,如果节点已满,则需要将节点分裂为两个各占M/2的节点;删除节点时,需要将两个不足M/2的兄弟节点合并。
当字典足够小,可以驻留在内存中时,AVL树和红黑书都能够保证获得很好的性能。对于较大的字典(外部字典或文件),它们必须存储在磁盘上,可以通过采用度数高的搜索树来改善字典的操作性能。在研究高度搜索树之前,先看一下用于外部字典的索引顺序访问方法(ISAM),这种方法提供了很好的顺序和随机访问。
要支持随机访问,索引是必不可少的。索引中包括每个块中的最大关键值。由于索引中包含的关键值的数量仅与块数相同,并且每个块一般都能储存很多元素,因此索引足以留在内存中。对关键之为k的元素做一次随机访问,首先只要寻得包含相应元素的块的索引,然后将相应的块从磁盘中取出并在其中寻找需要的元素。这样执行一次随机访问只需要一次磁盘访问就足够了。
这种技术可以扩充到更大的字典。这种字典能够跨越几个磁盘。现在,元素按升序被分配到各个磁盘以及每个磁盘的不同块中。每个磁盘都有一个块索引,其中保留了该磁盘每个快中的关键值。另外,有一个磁盘索引保存每个磁盘中的最大关键值,这个索引一般驻留在内存中。

m叉搜索树的高度是mh-1;
按照B-树的高度和元素个数公式(见笔记),因此,如果使用200序或者更高序的B-树,即使元素数量再多,树的高度也很小。实际上,B-树的序取决于磁盘块的大小和单个元素的大小。节点小于磁盘块大小并无好处,这是一位内每次磁盘访问只读或写一个块。节点大于磁盘块的大小会带来多重磁盘访问,每次磁盘访问都伴随一次搜索和时间延迟,因此节点大于磁盘块的大小也是不可取的。
4、B+树
性质:B+树是B-树的变体,也是一种多路搜索树:
1、其定义基本与B-树相同,除了:
2、非叶子节点的子树指针与关键字个数相同;
3、非叶子节点的子树指针P[i],指向关键字值属于[k[i],k[i+1])的子树(B-树是开区间)’
4、为所有叶子节点增加一个链指针;
5、所有关键字都在叶子结点出现;
B+树的搜索与B-树基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子节点命中),其性能也等价于在关键字全集做一次二分查找;
B+的特性:
1、所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2、不可能在非叶子节点命中;
3、非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储关键字数据的数据层;
4、更适合文件索引系统;
B+树的分裂:当一个节点满时,分配一个新的节点,并将原节点1/2的数据复制到新节点,最后在父节点中增加新节点的指针;B+树的分裂只影响原节点和父节点,而不会影响兄弟节点,所以它不需要指向兄弟的指针;
5、B*树
是从B+树的变体,在B+树的非根和非叶子节点再增加指向兄弟节点的指针;
B*树定义了非叶子节点关键字个数最少是2/3*M,即块的最低使用率是2/3.
B*树的分裂:当一个节点满时,如果它的下一个兄弟节点未满,那么将一部分数据转移到兄弟节点中,再在源节点插入关键字,最后修改父节点中兄弟节点的关键字(因为兄弟节点的关键字的范围改变了);如果兄弟也满了,则在原节点与兄弟节点之间增加新节点,并各复制1/3的数据到新节点,最后在父节点增加新节点的指针。所以B*树分配新节点的概率比B+树要低,空间使用率更高。

    原文作者:B树
    原文地址: https://blog.csdn.net/NKULM/article/details/61198482
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞