算法14动态查找表ppt课件

上传人:钟*** 文档编号:1365589 上传时间:2019-10-17 格式:PPT 页数:43 大小:2.66MB
返回 下载 相关 举报
算法14动态查找表ppt课件_第1页
第1页 / 共43页
算法14动态查找表ppt课件_第2页
第2页 / 共43页
算法14动态查找表ppt课件_第3页
第3页 / 共43页
点击查看更多>>
资源描述
,第8章 查找,1,8.2动态查找表,动态查找的特点是,表结构本身是在查找过程中动态生成的,即对给定关键字值key ,表中有具有此值的记录,则查找成功返回,否则插入此关键字的新记录。,2,输入数据序列 53,78,65,17,87,09,81,45,23,建立二叉排序树,3,二叉查找树的查找 插入新结点88,每次结点的插入,都要从根结点出发查找插入位置,然后把新结点作为叶结点插入。,二叉排序树的插入,4,输入数据序列 53,78,65,17,87,09,81,45,23,建立二叉排序树,5,40,以其前驱替代之,然后再删除该前驱结点,被删结点,前驱结点,被删关键字 = 50,20,30,32,35,40,50,80,85,88,90,91,6,由关键字序列 3,1,2,5,4构造一棵二叉排序树,由关键字序列 1,2,3,4,5构造一棵二叉排序树,,例如:,2,1,3,4,5,3,5,4,1,2,ASL =(1+2+3+4+5)/ 5= 3,ASL =(1+2+3+2+3)/ 5 = 2.2,6. 插入删除算法分析,7,结论: 含有n个结点的二叉排序树的平均查找长度和树的形态有关。最坏的情况为单支树,这时树的深度为n,其平均查找长度为(n+1)/2。最好的情况是二叉排序树的形态与折半查找相同,其平均查找长度和log n 成正比。,8,8.2.1.二叉排序树和平衡二叉树,7.平衡二叉树,(1). 二叉平衡树定义,(2). 如何构造“二叉平衡树”,(3). 二叉平衡树的查找性能分析,9,1. 二叉平衡树的定义,平衡二叉树或者是空树,或者是满足下列性质的二叉树。 左子树和右子树深度之差的绝对值不大于1; 左子树和右子树也都是平衡二叉树。 平衡因子(Balance Factor) :二叉树上结点的左子树的深度减去其右子树深度称为该结点的平衡因子。 因此,平衡二叉树上每个结点的平衡因子只可能是-1、0和1。 如果一棵二叉树既是二叉排序树又是平衡二叉树,称为平衡二叉排序树(Balanced Binary Sort Tree) 。,10,在平衡二叉排序树上执行查找的过程与二叉排序树上的查找过程完全一样,则在AVL树上执行查找时,和给定的K值比较的次数不超过树的深度。,结点类型定义如下: typedef struct BNode KeyType key ; /* 关键字域 */ int Bfactor ; /* 平衡因子域 */ /* 其它数据域 */ struct BNode *Lchild , *Rchild ; BSTNode ;,11,例如:,平衡树,非平衡树,非平衡树,结点的平衡因子:左子树的高度减右子树的高度 。,12,2. 如何构造“二叉平衡树”,在插入过程中,在保持二叉排序树特性的前提下,采用平衡旋转技术对最小不平衡子树进行调整,使其平衡。,13,不平衡二叉树四种类型的调整:,1.LL型:因为在A 的左孩子的左子树上插入结点而使A失去平衡,2.RR型:因为在A 的右孩子的右子树上插入结点而使A失去平衡,14,3.LR型:因为在A 的左孩子的右子树上插入结点而使A失去平衡,4.RL型:因为在A 的右孩子的左子树上插入结点而使A失去平衡,15,平衡化旋转,一般的二叉排序树是不平衡的,若能通过某种方法使其既保持有序性,又具有平衡性,就找到了构造平衡二叉排序树的方法,该方法称为平衡化旋转。 在对AVL树进行插入或删除一个结点后,通常会影响到从根结点到插入(或删除)结点的路径上的某些结点,这些结点的子树可能发生变化。以插入结点为例,影响可能有以下几种可能性: 以某些结点为根的子树的深度发生了变化; 某些结点的平衡因子发生了变化; 某些结点失去平衡。 沿着插入结点上行到根结点就能找到某些结点,这些结点 的平衡因子和子树深度都会发生变化,这样的结点称为失衡 结点。,16, 失衡原因 在结点a的左孩子的左子树上进行插入,插入使结点a失去平衡。a插入前的平衡因子是1,插入后的平衡因子是2。设b是a的左孩子,b在插入前的平衡因子只能是0,插入后的平衡因子是1(否则b就是失衡结点)。 平衡化旋转方法 通过顺时针旋转操作实现,如图所示。,1 LL型平衡化旋转,LL型平衡化旋转示意图,17,用b取代a的位置,a成为b的右子树的根结点,b原来的右子树作为a的左子树。, 插入后各结点的平衡因子分析 旋转前的平衡因子 设插入后b的左子树的深度为HbL,则其右 子树的深度为HbL-1; a的左子树的深度为 HbL+1。 a的平衡因子为2,则a的右子树的深度为: HaR=HbL+1-2=HbL-1。,18, 旋转后的平衡因子 a的右子树没有变,而左子树是b的右子树,则平衡因子是:HaL- HaR=(HbL-1)-(HbL-1)=0 即a是平衡的,以a为根的子树的深度是HbL。 b的左子树没有变化,右子树是以a为根的子树,则平衡因子是: HbL-HbL=0 即b也是平衡的,以b为根的子树的深度是HbL+1,与插入前a的子树的深度相同,则该子树的上层各结点的平衡因子没有变化,即整棵树旋转后是平衡的。,19, 旋转算法 void LL_rotate(BBSTNode *a) BBSTNode *b ; b=a-Lchild ; a-Lchild=b-Rchild ; b-Rchild=a ; a-Bfactor=b-Bfactor=0 ; a=b ; ,20, 失衡原因 在结点a的左孩子的右子树上进行插入,插入使结点a失去平衡。a插入前的平衡因子是1,插入后a的平衡因子是2。设b是a的左孩子,c为b的右孩子, b在插入前的平衡因子只能是0,插入后的平衡因子是-1; c在插入前的平衡因子只能是0,否则,c就是失衡结点。,2 LR型平衡化旋转,21, 插入后结点c的平衡因子的变化分析 插入后c的平衡因子是1:即在c的左子树上插入。设c的左子树的深度为HcL,则右子树的深度为HcL-1;b插入后的平衡因子是-1,则b的左子树的深度为HcL,以b为根的子树的深度是HcL+2。,22, 平衡化旋转方法 先以b进行一次逆时针旋转(将以b为根的子树旋转为以c为根),再以a进行一次顺时针旋转,如图所示。将整棵子树旋转为以c为根,b是c的左子树,a是c的右子树;c的右子树移到a的左子树位置, c的左子树移到b的右子树位置。,23, 旋转后各结点(a,b,c)平衡因子分析 旋转前 (插入后)c的平衡因子是1: a的左子树深度为HcL-1 ,其右子树没有变化,深度是HcL,则a的平衡因子是-1;b的左子树没有变化,深度为HcL,右子树是c旋转前的左子树,深度为HcL,则b的平衡因子是0; c的左、右子树分别是以b和a为根的子树,则c的平衡因子是0 。 旋转前 (插入后)c的平衡因子是0: 旋转后a,b,c的平衡因子都是0 。 旋转前 (插入后)c的平衡因子是-1: 旋转后a,b,c的平衡因子分别是0,-1,0 。 综上所述,即整棵树旋转后是平衡的。,24, 旋转算法 void LR_rotate(BBSTNode *a) BBSTNode *b,*c ; b=a-Lchild ; c=b-Rchild ; /* 初始化 */ a-Lchild=c-Rchild ; b-Rchild=c-Lchild ; c-Lchild=b ; c-Rchild=a ; if (c-Bfactor=1) a-Bfactor=-1 ;b-Bfactor=0 ; else if (c-Bfactor=0) a-Bfactor=b-Bfactor=0 ; else a-Bfactor=0 ; b-Bfactor=1 ; ,25, 失衡原因 在结点a的右孩子的左子树上进行插入,插入使结点a失去平衡,与LR型正好对称。对于结点a,插入前的平衡因子是-1,插入后a的平衡因子是-2。设b是a的右孩子,c为b的左孩子, b在插入前的平衡因子只能是0,插入后的平衡因子是1;同样,c在插入前的平衡因子只能是0,否则,c就是失衡结点。 插入后结点c的平衡因子的变化分析 插入后c的平衡因子是1:在c的左子树上插入。设c的左子树的深度为HcL,则右子树的深度为HcL-1。,3 RL型平衡化旋转,26,因b插入后的平衡因子是1,则其右子树的深度为HcL,以b为根的子树的深度是HcL+2;因插入后a的平衡因子是-2 ,则a的左子树的深度是HcL。 插入后c的平衡因子是0:c本身是插入结点。设c的左子树的深度为HcL,则右子树的深度也是HcL;因b插入后的平衡因子是1,则b的右子树的深度为HcL,以b为根的子树的深度是HcL+2;因插入后a的平衡因子是-2 ,则a的左子树的深度是HcL。 插入后c的平衡因子是-1:在c的右子树上插入。设c的左子树的深度为HcL,则右子树的深度为HcL+1 ,以c为根的子树的深度是HcL+2;因b插入后的平衡因子是1,则b的右子树的深度为HcL+1,以b为根的子树的深度是HcL+3;则a的右子树的深度是HcL+1。,27, 平衡化旋转方法 先以b进行一次顺时针旋转,再以a进行一次逆时针旋转,如图所示。即将整棵子树(以a为根)旋转为以c为根,a是c的左子树,b是c的右子树;c的右子树移到b的左子树位置,c的左子树移到a的右子树位置。,28, 旋转后各结点(a,b,c)的平衡因子分析 旋转前 (插入后)c的平衡因子是1: a的左子树没有变化,深度是HcL,右子树是c旋转前的左子树,深度为HcL,则a的平衡因子是0;b的右子树没有变化,深度为HcL,左子树是c旋转前的右子树,深度为HcL-1 ,则b的平衡因子是-1; c的左、右子树分别是以a 和b为根的子树,则c的平衡因子是0 。 旋转前 (插入后)c的平衡因子是0: 旋转后a,b,c的平衡因子都是0 。 旋转前 (插入后)c的平衡因子是-1: 旋转后a,b,c的平衡因子分别是1,0,0 。 综上所述,即整棵树旋转后是平衡的。,29, 旋转算法 Void RL_rotate(BBSTNode *a) BBSTNode *b,*c ; b=a-Rchild ; c=b-Lchild ; /* 初始化 */ a-Rchild=c-Lchild ; b-Lchild=c-Rchild ; c-Lchild=a ; c-Rchild=b ; if (c-Bfactor=1) a-Bfactor=0 ; b-Bfactor=-1 ; else if (c-Bfactor=0) a-Bfactor=b-Bfactor=0 ; else a-Bfactor=1 ; b-Bfactor=0 ; ,30, 失衡原因 在结点a的右孩子的右子树上进行插入,插入使结点a失去平衡。要进行一次逆时针旋转,和LL型平衡化旋转正好对称。 平衡化旋转方法 设b是a的右孩子,通过逆时针旋转实现,如图所示。用b取代a的位置,a作为b的左子树的根结点,b原来的左子树作为a的右子树。,4 RR型平衡化旋转,31, 旋转算法 BBSTNode *RR_rotate(BBSTNode *a) BBSTNode *b ; b=a-Rchild ; a-Rchild=b-Lchild ; b-Lchild=a ; a-Bfactor=b-Bfactor=0 ; a=b ; 对于上述四种平衡化旋转,其正确性容易由“遍历所得中序序列不变”来证明。并且,无论是哪种情况,平衡化旋转处理完成后,形成的新子树仍然是平衡二叉排序树,且其深度和插入前以a为根结点的平衡二叉排序树的深度相同。所以,在平衡二叉排序树上因插入结点而失衡,仅需对失衡子树做平衡化旋转处理。,32,平衡二叉排序树的插入操作实际上是在二叉排序插入的基础上完成以下工作: 判别插入结点后的二叉排序树是否产生不平衡? 找出失去平衡的最小子树; 判断旋转类型,然后做相应调整。 失衡的最小子树的根结点a在插入前的平衡因子不为0,且是离插入结点最近的平衡因子不为0的结点的。 若a失衡,从a到插入点的路径上的所有结点的平衡因子都会发生变化,在该路径上还有一个结点的平衡因子不为0且该结点插入后没有失衡,其平衡因子只能是由1到0或由-1到0,以该结点为根的子树深度不变。该结点的所有祖先结点的平衡因子也不变,更不会失衡。,平衡二叉排序树的插入,33,1 算法思想(插入结点的步骤) 按照二叉排序树的定义,将结点s插入; 在查找结点s的插入位置的过程中,记录离结点s最近且平衡因子不为0的结点a,若该结点不存在,则结点a指向根结点; 修改结点a到结点s路径上所有结点的; 判断是否产生不平衡,若不平衡,则确定旋转类型并做相应调整。 2 算法实现,34,void Insert_BBST(BBSTNode *T, BBSTNode *S) BBSTNode *f,*a,*b,*p,*q; if (T=NULL) T=S ; T-Bfactor=0 ; return ; a=p=T ; /a指向离s最近且平衡因子不为0的结点 f=q=NULL ; /f指向a的父结点,q指向p父结点 while (p!=NULL) if (EQ(S-key, p-key) ) return ; / 结点已存在 if (p-Bfactor!=0) a=p ; f=q ; q=p ; if (LT(S-key, p-key) ) p=p-Lchild ; else p=p-Rchild ; / 在右子树中搜索 /找插入位置,35,if (LT(S-key,p-key) q-Lchild=S ;/s为左孩子 else q-Rchild=S ; /s插入为q的右孩子 p=a ; while (p!=S) if (LT(S-key, p-key) ) p-Bfactor+ ; p=p-Lchild ; else p-Bfactor- ; p=p-Rchild ; / 插入到左子树,平衡因子加1,插入到左子树,减1 if (a-Bfactor-2,36,if (b-Bfactor=1) p=LL_rotate(a) ; else p=LR_rotate(a) ; else b=a-Rchild ; if (b-Bfactor=1) p=RL_rotate(a) ; else p=RR_rotate(a) ; / 修改双亲结点指针 if (f=NULL) T=p ; /p为根结点 else if (f-Lchild=a) f-Lchild=p ; else f-Lchild=p ; ,37,例: 设要构造的平衡二叉树中各结点的值分别是(3, 14, 25, 81, 44),平衡二叉树的构造过程如下:,38,平衡化旋转,RR型旋转,39,LL型旋转,40,LR型旋转,41,RL型旋转,42,3.平衡树的查找性能分析:,在平衡树上进行查找的过程和二叉排序树相同, 查找过程中与给定值进行比较的关键字的个数不超过平衡树的深度。,因此,在二叉平衡树上进行查找时, 查找过程中和给定值进行比较的关键字的个数和 log(n) 相当。,43,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!