数据结构9章查找.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章 查找 9.1静态查找表 9.2动态查找表 9.3哈希表 相关概念 查找表:是由同一类型的数据元素构成的集合。 关键字:是数据元素中某个数据项的值,用它可以标识一个数据元素。 查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的记录或数据元素。 9.1 静态查找表 一、顺序查找( 又称线性查找 ) (2)算法的实现: 讨论① 查不到怎么办? 讨论① 若关键字不在表中,怎样得知和停止? 平均每个数据的查找时间还要除以n,所以: 三、静态树表的查找 在不等概率查找的情况下,折半查找不是最好的查找方法 例如: 关键字: A B C D E Pi: 0.1 0.2 0.1 0.4 0.2 Ci: 2 3 1 2 3 此时的 ASL = 2.3 若改变Ci的值 3 2 3 1 2 则 ASL = 1.8 分块查找(索引顺序查找) 查找步骤分两步进行: 1、二叉排序树及其查找过程 二叉排序树例 结点左子树上所有关键码小于结点关键码 右子树上所有关键码大于结点关键码 (2)二叉排序树上的搜索 2、AVL树 高度平衡的二叉搜索树 结点的平衡因子balance (balance factor) 每个结点附加一个数字, 给出该结点右子树的高度减去左子树的高度所得的高度差,这个数字即为结点的平衡因子balance AVL树任一结点平衡因子只能取 -1, 0, 1 如果一个结点的平衡因子的绝对值大于1,则这棵二叉搜索树就失去了平衡, 不再是AVL树。 如果一棵二叉搜索树是高度平衡的, 且有 n 个结点,其高度可保持在O(log2n),平均搜索长度也可保持在O(log2n)。 平衡化旋转 如果在一棵平衡的二叉搜索树中插入一个新结点,造成了不平衡。此时必须调整树的结构,使之平衡化。 平衡化旋转有两类: 单旋转 (左旋和右旋) 双旋转 (左右双旋和右左双旋) 每插入一个新结点时, AVL 树中相关结点的平衡状态会发生改变。因此, 在插入一 个新结点后,需要从插入位置沿通向根的路径回溯,检查各结点的平衡因子。 如果在某一结点发现高度不平衡,停止回溯。从发生不平衡的结点起,沿刚才回溯的路径取直接下两层的结点。 如果这三个结点处于一条直线上,则采用单旋转进行平衡化。单旋转可按其方向分为左单旋转和右单旋转, 其中一个是另一 个的镜像,其方向与不平衡的形状相关。 如果这三个结点处于一条折线上,则采用双旋转进行平衡化。双旋转分为先左后右和先右后左两类。 左单旋转 (RotateLeft ) 在子树BR中插入新结点,该子树高度增1导致结点A的平衡因子变成+2,出现不平衡。 沿插入路径检查三个结点A、B和BR 。它们处于方向为“\”的直线上,需做左单旋转。 以结点B为旋转轴,让结点A反时针旋转。 先右后左双旋转 (RotationRightLeft) 右左双旋转是左右双旋转的镜像。 在子树F或G中插入新结点,该子树高度增1。结点A的平衡因子变为2,发生了不平衡。 从结点A起沿插入路径选取3个结点A、C和D,它们位于一条形如“?”的折线上,需要进行先右后左的双旋转。 首先做右单旋转:以结点D为旋转轴,将结点C顺时针旋转,以D代替原来C的位置。 再做左单旋转:以结点D为旋转轴,将结点A反时针旋转,恢复树的平衡。 (2)AVL树的插入 在向一棵本来是高度平衡的AVL树中插入一个新结点时,如果树中某个结点的平衡因子的绝对值 |balance| 1,则出现了不平衡,需要做平衡化处理。 在AVL树上定义了重载操作“”和“”,以及中序遍历的算法。利用这些操作可以执行AVL树的建立和结点数据的输出。 算法从一棵空树开始,通过输入一系列对象关键码,逐步建立AVL树。在插入新结点时使用平衡旋转方法进行平衡化处理。 (3)AVL树的删除 A、如果被删结点x最多只有一个子女,那么问题比较简单: 将结点x从树中删去。 因为结点x最多有一个子女,可以简单地把x的双亲结点中原来指向x的指针改指到这个子女结点; 如果结点x没有子女,x双亲结点的相应指针置为NULL。 将原来以结点x为根的子树的高度减1。 B、 如果被删结点x有两个子女: 搜索 x 在中序次序下的直接前驱 y (同样可以找直接后继)。 把 结点y 的内容传送给结点x,现在问题转移到删除结点 y。把结点y当作被删结点x。 因为结点y最多有一个子女,我们可以简单地用(1)给出的方法进行删除。 必须沿 x 通向根的路径反向追踪高度的变化对路 径上各个结点的影响。 用一个布尔变量 shorter 来指明子树的高度是否被缩短。在每个结点上要做的操作取决于 shor

文档评论(0)

好文精选 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档