数据结构与算法分析第八章查找.pptVIP

  • 1
  • 0
  • 约1.18万字
  • 约 151页
  • 2018-05-19 发布于四川
  • 举报
Chapter 8 Search 通常称用于搜索的数据集合为搜索结构,它是由同一数据类型的对象(或记录)组成 在每个对象中有若干属性,其中有一个属性,其值可唯一地标识这个对象。称为关键码。使用基于关键码的搜索,搜索结果应是唯一的。但在实际应用时,搜索条件是多方面的,可以使用基于属性的搜索方法,但搜索结果可能不唯一 实施搜索时有两种不同的环境 静态环境 搜索结构在插入和删除等操作的前后不发生改变 ? 静态搜索表 查找算法的评价指标 查找成功:最少比较次数 最多比较次数 平均比较次数 查找失败:最少比较次数 最多比较次数 平均比较次数  查找成功:最少比较次数  1 最多比较次数  n  平均比较次数 (n+1)/2 查找失败:最少比较次数 n+1 最多比较次数 n+1 平均比较次数 n+1 基于有序顺序表的折半搜索 设n个对象存放在一个有序顺序表中,并按其关键码从小到大排好了序 折半搜索时, 先求位于搜索区间正中的对象的下标mid,用其关键码与给定值x比较 1.Element[mid].key==x 搜索成功 2.Element[mid].keyx 把搜索区间缩小到表的前半部分,继续折半搜索 3.Element[mid].keyx 把搜索区间缩小到表的后半部分,继续折半搜索 如果搜索区间已缩小到一个对象,仍未找到想要搜索的对象,则搜索失败 搜索成功时检测指针停留在树中某个结点 搜索不成功时检测指针停留在某个外结点(失败结点) 有序顺序表的折半搜索的判定树 ( 10, 20, 30, 40, 50, 60 )  查找成功:最少比较次数  ? 最多比较次数  ?  平均比较次数 ? 查找失败:最少比较次数 ? 最多比较次数 ? 平均比较次数 ? 分块查找 查找过程:将表分成几块,块内无序,块间有序;先确定待查记录所在块,再在块内查找 适用条件:分块有序表 算法实现 用数组存放待查记录,每个数据元素至少含有关键字域 建立索引表,每个索引表结点含有最大关键字域和指向本块第一个结点的指针 分块查找方法评价 n 个结点的二叉搜索树的数目 3 个结点的二叉搜索树 结点的平衡因子 (balance factor) 每个结点附加一个数字, 给出该结点右子树的高度减去左子树的高度所得的高度差, 这个数字即为结点的平衡因子 AVL树任一结点平衡因子只能取 -1, 0, 1 如果一个结点的平衡因子的绝对值大于1, 则这棵二叉搜索树就失去了平衡, 不再是AVL树 如果一棵二叉搜索树是平衡的, 且有 n个结点,其高度可保持在 O(log2n),平均搜索长度也可保持在O(log2n) 平衡化旋转 如果在一棵平衡的二叉搜索树中插入一个新结点,造成了不平衡。此时必须调整树的结构,使之平衡化 平衡化旋转有两类: 单旋转 (左旋和右旋) 双旋转 (左旋加右旋和右旋加左旋) 每插入一个新结点时, AVL 树中相关 结点的平衡状态会发生改变。因此, 在插入一 个新结点后,需要从插入位置沿通向根的路径回溯,检查各结点的平衡因子 如果在某一结点发现高度不平衡,停止回溯。从发生不平衡的结点起,沿刚才回溯的路径取直接下两层的结点 如果这三个结点处于一条直线上,则采用单旋转进行平衡化 单旋转可按其方向分为左单旋转和右单旋转, 其中一个是另一 个的镜像,其方向与不平衡的形状相关 如果这三个结点处于一条折线上,则采用双旋转进行平衡化 双旋转分为先左后右和先右后左两类 左单旋转 ( RotateLeft, L型 ) 在子树E中插入新结点,该子树 高度增 1导致结点 A的平衡因子 变成 +2,产生不平衡( L型 ) 以结点C为旋转轴,将结点A反时针旋转 在子树D中插入新结点, 该子树 高度增 1导致结点 A的平衡因子 变成 -2,产生不平衡( R型 ) 以结点B为旋转轴,将结点A顺时针旋转 在子树F或G中插入新结点,该子树 高度增 1 导致结点 A 的平衡因子变成 -2,产生不平衡( LR型 ) 首先以结点E为旋转轴,将结点B反时针旋转,以E代替原来B的位置,做左单旋转 再以结点E为旋转轴,将结点A顺时针旋转,做右单旋转 先右后左双旋转 (Ro

文档评论(0)

1亿VIP精品文档

相关文档