北京师范大学数据结构教学资料 第10章——文件、外部排序与外部搜索资料教程.ppt

北京师范大学数据结构教学资料 第10章——文件、外部排序与外部搜索资料教程.ppt

北京师范大学数据结构教学资料 第10章——文件、外部排序与外部搜索资料教程.ppt

55 删除55 结点合并 80 m = 3 删除55 10 40 60 58 75 30 50 a c b d e f g h 合并f, g 58 60 80 10 40 75 30 50 a c b d e f h 55 非叶结点删除 删除50 删除55 55 58 75 80 m = 3 删除50 10 40 65 60 70 30 50 a c b d e f g h 58 75 80 删除55 10 40 65 60 70 30 a c b d e f g h 用55取代 用58取代 58 75 80 10 40 65 60 70 30 a c b d e f g h 合并f, g 58 75 80 10 40 60 65 70 30 a c b d e f h 结点合并与调整 删除70 58 80 10 40 60 65 75 30 a c b d e f h 删除70 用75取代 删除75 58 10 40 60 65 80 30 a c b d e f h 删除75 用80取代 调整f, c, h 高度h=4的3路搜索树, 关键码最大数为34-1 = 80。 在 m 路搜索树上的 搜索过程是一个在 结点内搜索和自根 结点向下逐个结点 搜索的交替的过程。 m路搜索树的搜索算法 35 20 40 a b c d e 25 30 10 15 45 50 root 搜索35 template class T TripleT MtreeT::Search (const T x) { //用关键码 x 搜索驻留在磁盘上的m路搜索树 //各结点格式为n,p[0],(k[1],p[1]),…,(k[n],p[n]), n m //函数返回一个类型为Triple(r,i,tag)的记录。 //tag = 0, 表示 x 在结点r中找到, 该结点的k[i]等于x; //tag = 1, 表示没有找到x, 可插入结点为r, 插入到该 //结点的k[i]与k[i+1]之间。 Triple result; //记录搜索结果三元组 GetNode (root); //从盘上读取结点root MtreeNodeT *p = root, *q = NULL; //p是扫描指针,q是p的父结点指针 while (p != NULL) { //从根开始检测 int i = 0; p-key[(p-n)+1] = MaxValue; while (p-key[i+1] x) i++; //在结点内搜索 if (p-key[i+1] == x) { //搜索成功 result.r = p; result.i = i+1; result.tag = 0; return result; } q = p; p = p-ptr[i]; //本结点无x, q记下当前结点, p下降到子树 GetNode(p); //从磁盘上读取结点p } result.r = q; result.i = i; result.tag = 1; return result; //搜索失败,返回插入位置 }; 提高搜索树的路数 m, 可以改善树的搜索性能。对于给定的关键码数 n,如果搜索树是平衡的,可以使 m 路搜索树的性能接近最佳。下面将讨论一种称之为B 树的平衡的 m 路搜索树。 B 树 一棵 m 阶B 树是一棵平衡的 m 路搜索树, 它或者是空树, 或者是满足下列性质的树: 根结点至少有 2 个子女。 除根结点以外的所有结点 (不包括失败结点)至少有 ?m/2? 个子女。 所有的失败结点都位于同一层。 在B 树中的“失败”结点是当 x 不在树中时才能到达的结点。这些结点实际不存在,指向它们的指针为NULL。它们不计入树的高度。 注意,m阶B树继承了m路搜索树的定义。原来m路搜索树定义中的规定在m阶B树中都保留。 事实上,在B 树的每个结点中还包含有一组指针recptr[m+1],指向实际记录的存放地址。 key[i]与recptr[i] (1≤i≤nm) 形成一个索引项 (key[i], recptr[i]),通过key[i]可找到某个记录的存储地址recptr[i]。 在讨论B树结构的操作时先不涉及recptr[i],因此在后续讨论中该指针不出现。 一棵B 树是平衡的 m 路搜索树,但一棵平衡的 m 路搜索树不一定是B 树。 2-3树是3阶的B树,2-3-4树

文档评论(0)

1亿VIP精品文档

相关文档