学习 严蔚敏讲数据结构笔记21

来源:互联网 发布:php获取上上个文件夹名 编辑:程序博客网 时间:2024/06/07 22:29

 

三、B-

1.B-树的定义

B-树是一种平衡的多路查找树:

m阶的B-树上,每个非终端结点可能含有:

n个关键字Ki(i<=i<=n)n<m

n个指向记录的指针Di(1<=i<=n)

n+1个指向子树的指针Ai(0<=i<=n)

非叶结点中的多个关键字均自小至大有序排列,即:K1<K2<…Kn

Ai-1所指字数上所有关键字均小于Ki

Ai所指子树上所有关键字均大于Ki

树中所有叶子结点均不带信息,且在树中的同一层次上;根结点或为叶子结点,或至少有两棵子树;其余非叶结点至少有[m/2]棵子树,至多有m棵子树。

 

B-树结构的C语言描述如下:

 

37_001

#define m 3 //B树的阶,暂设为3

typedef struct BTNode

{

         int  keynum; //结点中关键字个数,即结点的大小

         struct  BTNode *parent; //指向双亲结点的指针

         KeyType  key[m+1]; //关键字(0号单元不用)

         struct  BTNode *ptr[m+1]; //子树指针向量

         Record  *recptr[m+1]; //记录指针向量

}BTNode *PTree; //B树结点和B树的类型

2.查找过程:

从根结点出发,沿指针搜索节诶的和在结点内进行顺序(或折半)查找两个过程交叉进行。若查找成功,则返回指向被查关键字所在结点的指针和关键字在结点中的位置;若查找不成功,则返回插入位置。

 

38_001

Result SearchBTree(BTree T, KeyType K)

{

         p  = T;

         q  = NULL;

         found  = FALSE;

         i  = 0;

         while(p  && !found)

         {

                   n  = p->keynum;

                   i  = Search(p, K);

                   //p->key[1...keynum]中查找ip->key[i] <= K < p->key[i+1]

                   if(i  > 0 && p->key[i] == K)

                            found  = TRUE;

                   else

                   {

                            q  = p;

                            p  = p->ptr[i];

                   }

         }

         if(found)

                   return(p,  i, l); //查找成功

         else

                   return(q,  i, 0);

}//SearchBTree

3插入

在查找不成功后,需进行插入。显然,关键字插入的位置必定在最下层的非叶结点,有下列几种情况:

1)  插入后,该结点的关键字个数n<m,不修改指针。

2)  插入后,该节点的关键字个数n=m,则需进行“结点分裂”,令s=                            ,在原结点中保留(A0,K1,…,KS-1,AS-1;新建结点(AS,KS+1,…,Kn,An);将(Ks,p)插入双亲结点;

3)  若双亲为空,则建新的根结点。

 

4.删除

和插入的考虑相反,首先必须找到待删关键字所在结点,并且要求删除之后,结点中关键字的个数不能小于,否则,要从其左(或右)兄弟结点“借调”关键字,若其左和右兄弟结点均无关键字可借(结点中只有最少量的关键字),则必须进行结点的“合并”。、

 

5.查找性能的分析

B-树的查找时间主要花费在搜索结点(访问外存)上,即主要取决于B-树的深度。

 

问:含N个关键字的mB-树的深度H的最大值为多少?

先推导出每一层所含最少结点数:

 

1

1

2

2

3

2*[m/2]

4

2*([m/2])2

H+1

2*([m/2])H-1

假设mB-树的深度为H+1,由于第H+1层为叶子结点,而因为树中含有N个关键字,则叶子结点必为N+1个,由此

N+1>=2([m/2])H-1

H-1<=log[m/2]((N+1)/2)

H<log[m/2]((N+1)/2)+1

所以,在含N个关键字的B-树上进行一次查找,需访问的结点个数不超过H<log[m/2]((N+1)/2)+1

 

四、B+

B-树的一种变型

1.      B+树的结构特点:

每个叶子结点中含有n个关键字和n个指向记录的指针;并且,所有叶子结点彼此相链构成一个有序链表,其头指针指向含最小关键字的结点。

每个非叶结点中的关键字Ki即为其相应指针Ai所指子树中关键字的最大值;

所有叶子结点都处在同一层次上,每个叶子结点中关键字的个数介于[m/2]m之间。

2.      查找过程

B+树上,既可以进行缩小范围的查找,也可以进行顺序查找;

在进行缩小范围的查找时,不管成功与否,都必须查找到叶子结点才能结束;

若在结点内查找时,给定值<=Ki,则应继续在Ai所指子树中进行查找;

3.      插入和删除类似于B-

 

五、键树

1.键树的结构特点:

关键字中各个符号分布在从根结点到叶的路径上,叶结点内的符号为“结束”的标识符,因此,键树的深度和关键字集合的大小无关。

键树被约定为是一棵有序树,即同一层中兄弟结点之间依所含符号自左至右有序,并约定结束符’$’小于任何其它符号。

键树可有两种表示方法:

1)  以孩子-兄弟链表作树的存储结构----双链树

2)  以多重链表作树的存储结构---Trie

 

9.3哈希表

一、哈希表是什么?

二、哈希函数的构造方法

三、处理冲突的方法

四、哈希表的查找

五、哈希表的删除操作

六、对静态查找表,。。。。

 

 

原创粉丝点击