原博客地址http://blog.sina.com.cn/s/blog_a46817ff0101devp.html
B树是一种外排序的查找树,一个B树算法的运行时间主要由它所执行的DISK-READ和DISK-WRITE操作次数决定,所以我们希望这些操作能够读或尽可能多的信息。因此,一个B树结点通常烽一个完整磁盘页一样大,并且磁盘页的大小限制了一个B树结点可以含有的孩子的个数。
-
1 .B-树定义
B-树是一种平衡的多路查找树,它在文件系统中很有用。
定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:
⑴树中每个结点至多有m 棵子树;
⑵若根结点不是叶子结点,则至少有两棵子树;
⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树;
⑷所有的非终端结点中包含以下信息数据:
其中:Ki(i=1,2,…,n)为关键码,且Ki
⑸所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。
B-树的查找类似二叉排序树的查找,所不同的是B-树每个结点上是多关键码的有序表,在到达某个结点时,先在有序表中查找,若找到,则查找成功;否则,到按照对应的指针信息指向的子树中去查找,当到达叶子结点时,则说明树中没有对应的关键码。
在上图的B-树上查找关键字47的过程如下:
1)首先从更开始,根据根节点指针找到 *节点,因为 *a 节点中只有一个关键字,且给定值47 > 关键字35,则若存在必在指针A1所指的子树内。
2)顺指针找到 *c节点,该节点有两个关键字(43和 78),而43 < 47 < 78,若存在比在指针A1所指的子树中。
3)同样,顺指针找到 *g节点,在该节点找到关键字47,查找成功。
2. 查找算法
- typedef
int KeyType ; - #define
m 5 - typedef
struct Node{ -
int keynum; -
struct Node *parent; -
KeyType key[m+1]; -
struct Node *ptr[m+1]; -
Record *recptr[m+1]; - }NodeType;
-
- typedef
struct{ -
NodeType *pt; -
int i; -
int tag; - }Result;
-
- Result
SearchBTree(NodeType *t,KeyType kx) - {
-
-
-
-
p=t;q=NULL;found=FALSE;i=0; -
while(p&&!found) -
{ n=p->keynum;i=Search(p,kx); -
if(i>0&&p->key[i]= =kx) found=TRUE; -
else {q=p;p=p->ptr[i];} -
} -
if(found) return (p,i,1); -
else return (q,i,0); - }
B- 树查找算法分析
从查找算法中可以看出, 在B- 树中进行查找包含两种基本操作:
3.B-树的插入
如图(a) 为3阶的B-树(图中略去F结点(即叶子结点)),假设需依次插入关键字30,26,85。
1) 首先通过查找确定插入的位置。由根*a 起进行查找,确定30应插入的在*d 节点中。由于*d 中关键字数目不超过2(即m-1),故第一个关键字插入完成:如(b)
2) 同样,通过查找确定关键字26亦应插入 *d. 由于*d节点关键字数目超过2,此时需要将 *d分裂成两个节点,关键字26及其前、后两个指针仍保留在 *d 节点中,而关键字37 及其前、后两个指针存储到新的产生的节点 *d` 中。同时将关键字30 和指示节点 *d `的指针插入到其双亲的节点中。由于 *b节点中的关键字数目没有超过2,则插入完成.如(c)(d)
3) (e) -(g) 为插入85后;
插入算法:
- int
InserBTree(NodeType **t,KeyType kx,NodeType *q,int i){ -
-
-
x=kx;ap=NULL;finished=FALSE; -
while(q&&!finished) -
{ -
Insert(q,i,x,ap); -
if(q->keynum -
else -
{ -
s=m/2;split(q,ap);x=q->key[s]; -
-
q=q->parent; -
if(q) i=Search(q,kx); -
} -
} -
if(!finished) -
NewRoot(t,q,x,ap); - }
因此,下面我们可以只需讨论删除最下层非终端结点中的关键字的情形。有下列三种可能:
[例如],从图图4.2( a)中删去50,需将其右兄弟结点中的61上移至*e结点中,而将*e结点中的53移至*f,从而使*f和*g中关键字数目均不小于ceil(m-1)-1,而双亲结点中的关键字数目不变,如图图4.2(b)所示。
[例如],从图4.2(b)所示 B-树中删去53,则应删去*f结点,并将*f中的剩余信息(指针“空”)和双亲*e结点中的 61一起合并到右兄弟结点*g中。删除后的树如图4.2(c)所示。
[例如],在
B-树主要应用在文件系统
为了将大型数据库文件存储在硬盘上以减少访问硬盘次数为目的 在此提出了一种平衡多路查找树——B-树结构 由其性能分析可知它的检索效率是相当高的为了提高
B+树
树的差异在于:
⑴有n 棵子树的结点中含有n 个关键码;
⑵所有的叶子结点中包含了全部关键码的信息,及指向含有这些关键码记录的指针,且
叶子结点本身依关键码的大小自小而大的顺序链接。
⑶所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键码。
树,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。