B树和B+树
B(Balanced)树(注意:B树就是很多人口中所说的B-树,这是不专业的,不要区分两者)和B+树是用来对操作系统的文件索引和数据库索引而提出的数据结构,通俗点讲,两者都是有序数组+平衡多叉树。
B树的定义:一棵m阶的B树,或为空树,或为满足下列特性的m叉树
(1)树中的每个结点至多有m棵子树;
(2)若根结点不是叶子结点,则至少有2棵子树;
(3)除根结点之外的非终端结点至少有m/2(取上整)棵子树;
(4)所有的非终端结点,最多包含n个关键字,m/2(取上整)-1 <= n <=m-1;
(5)所有的叶子结点都出现在同一层次上,且不带任何信息。(可以看做是外部结点或查询失败的结点,实际上这些结点不存在,指向这些结点的指针为空);
B树的查询要点:待查关键字所在结点在B树上的层次,是决定B树查询效率的首要因素。有个问题,含N个关键字的m阶B树的最大深度是多少?
根据定义,第一层至少有1个结点,第二层2个,第三次至少2(m/2(取上整)),依次类推,第L+1层至少2(m/2(取上整))L-1.而L+1层为叶子结点。若m阶B树中有N个关键字,那么就有N+1叶子结点。
因此N+1 ≥ 2*(m/2(取上整))L-1,计算出L即可。
画个例子(注:网上找的):
2、B+树:它是应文件系统所需而产生的数据结构。直接上图理解:
它与B树的区别主要在于:
(1)有n棵子树的结点中包含n个关键字;
(2)所有的叶子结点中包含了全部关键字信息,及指向这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大链接。
(3)所有非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中最大(或最小)关键字。
B+树查找:在查找过程中,若非终端结点上的关键字等于给定值,并不终止,而是继续向下直到叶子结点。因此,不管查找什么,每一次查找都会走一条从根结点到叶子结点的路径。
那么为什么B+树比B树更适合用于文件系统索引和数据库索引:
个人见解,有2方面原因:
(1)B+树遍历效率高,因为只要遍历它的叶子结点即可。
(2)B+树搜索都要走一条从根结点到叶子结点的路径,查找更稳定。