- 1、本文档共110页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法与数据结构第9章查找祥解.ppt
(4) RL型调整 7 3 11 9 16 调整以7为根的不平衡子树 8 8 3 9 7 11 16 插入8 (4) RL型调整 R L 例9.3 输入关键字序列{16,3,7,11,9,26,18,14,15},给出构造一棵AVL树的步骤。 在平衡二叉树上进行查找的过程和在二叉排序树上进行查找的过程完全相同,因此,在平衡二叉树上进行查找关键字的比较次数不会超过平衡二叉树的深度。 在最坏的情况下,普通二叉排序树的查找长度为O(n)。那么,平衡二叉树的情况又是怎样的呢?下面分析平衡二叉树的高度h和结点个数n之间的关系。 构造一系列的平衡二叉树T1,T2,T3,…,其中,Th(h=1,2,3,…)是高度为h且结点数尽可能少的平衡二叉树,如下图所示的T1,T2,T3和T4。 为了构造Th,先分别构造Th-1和Th-2,使Th以Th-1和Th-2作为其根结点的左、右子树。对于每一个Th,只要从中删去一个结点,就会失去平衡或高度不再是h(显然,这样构造的平衡二叉树在结点个数相同的平衡二叉树中具有最大高度)。 结点个数n最少的平衡二叉树 通过计算上述平衡二叉树中的结点个数,来建立高度 与结点个数之间的关系。设N(h)为Th的结点数,从图中 可以看出有下列关系成立: N(1)=1,N(2)=2,N(h)=N(h-1)+N(h-2)+1 当h1时,此关系类似于定义Fibonacci数的关系: F(1)=1,F(2)=1,F(h)=F(h-1)+F(h-2) 通过检查两个序列的前几项就可发现两者之间的对应关系: N(h)=F(h+2)-1 由于Fibonacci数满足渐近公式:F(h)= 其中, 故由此可得近似公式:N(h)= 即:h≈log2(N(h)+1) 所以,含有n个结点的平衡二叉树的平均查找长度为O(log2n)。 思考题 为什么提出AVL树? 9.3.3 B-树 B-树又称为多路平衡查找树,是一种组织和维护外存文件系统非常有效的数据结构。 B-树中所有结点的孩子结点最大值称为B-树的阶,通常用m表示,从查找效率考虑,要求m≥3。一棵m阶B-树或者是一棵空树,或者是满足下列要求的m叉树: (1) 树中每个结点至多有m个孩子结点(即至多有m-1个关键字); (2) 除根结点外,其他结点至少有?m/2?个孩子结点(即至少有?m/2?-1=?(m-1)/2?个关键字); (3) 若根结点不是叶子结点,则根结点至少有两个孩子结点; (4) 每个结点的结构为: pn kn … p2 k2 p1 k1 p0 n 其中,n为该结点中的关键字个数,除根结点外,其他所有结点的n大于等于?m/2?-1,且小于等于m-1;ki(1≤i≤n)为该结点的关键字且满足ki<ki+1;pi(0≤i≤n)为该结点的孩子结点指针且满足pi(0≤i≤n-1)结点上的关键字大于等于ki且小于ki+1,pn结点上的关键字大于kn。 (5) 所有叶子结点都在同一层上,即B-树是所有结点的平衡因子均等于0的多路查找树。 一棵5阶B-树 在B-树的存储结构中,各结点的类型定义如下: #define MAXM 10 //定义B-树的最大的阶数 typedef int KeyType; //KeyType为关键字类型 typedef struct node //B-树结点类型定义 { int keynum; //结点当前拥有的关键字的个数 KeyType key[MAXM]; //[1..keynum]存放关键字,[0]不用 struct node *parent; //双亲结点指针 struct node *ptr[MAXM]; //孩子结点指针数组[0..keynum] } BTNode; B-树的查找 在B-树中查找给定关键字的方法类似于二叉排序树上的查找,不同的是在每个记录上确定向下查找的路径不一定是二路(即二叉)的,而是n+1路的。因为记录内的关键字序列是有序的数量key[1..n],故既可以用顺序查找,也可以用折半查找。在一棵B-树上顺序查找关键字为k的方法为: 将k与根结点中的key[i]进行比较: (1) 若k=key[i],则查找成功; (2) 若k<key[1],则沿着指针ptr[0]所指的子树继续查找; (3) 若key[i]<k<key[i+1],则沿着指针ptr[i]所指的子树继续查找;
文档评论(0)