三、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]中查找i,p->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个关键字的m阶B-树的深度H的最大值为多少?
先推导出每一层所含最少结点数:
第1层 |
1 |
第2层 |
2 |
第3层 |
2*[m/2] |
第4层 |
2*([m/2])2 |
第H+1层 |
2*([m/2])H-1 |
假设m阶B-树的深度为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哈希表
一、哈希表是什么?
二、哈希函数的构造方法
三、处理冲突的方法
四、哈希表的查找
五、哈希表的删除操作
六、对静态查找表,。。。。