静态查找表.ppt_第1页
静态查找表.ppt_第2页
静态查找表.ppt_第3页
静态查找表.ppt_第4页
静态查找表.ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第九章 查找,9.1 静态查找表 9.1.1 顺序表的查找 9.1.2 有序表的查找 9.2 动态查找表 9.2.1 二叉排序树和二叉平衡树 9.3 哈希( Hashing )表(散列表),第九章 查找,查找表 (search table): 同一类型数据元素构成的集合。 查找操作: (1)查询某个“特定的”数据元素是否在查找表中; (2)检索某个“特定的”数据元素的各种属性; (3)在查找表中插入一个数据元素; (4)从查找表中删除某个数据元素. 静态查找表:对查找表只作(1)、(2)操作; 动态查找表:可以对查找表作(1)-(4)操作。,有关查找的“词”的含义,关键字(KEY): 数据元素

2、(或记录)的某个数据项的值,用以标识一个数据元素(或记录). 可以唯一标识一个记录的关键字称为主关键字(Primary Key); 否则称为次关键字(Secondary Key). 查找(Searching) 根据给定的值,在查找表中确定一个关键字等于给定值的记录或数据元素.,9.1 静态查找表,可以用顺序表,也可以用线性链表来表示静态查找表。 顺序表的查找 typedef struct /静态查找表的顺序存储结构 ElemType *elem; int length; SSTable;,顺序查找(Sequential Search),int Search_Seq(SSTable ST, Ke

3、yType key) ST.elem0.key = key; / “哨兵” for(i=ST.length; !EQ(ST.elemi.key, key); -i); return i; 性能分析: 设Pi为查找表中第i个记录的概率(取Pi=1/n); Ci为找到第i个记录所需的查找次数。则 n ASL = Pi Ci = nP1+(n-1)P2+.+2Pn-1+Pn i=1 = n+(n-1) +.+2+1*1/n = (n+1)/2 若查找成功与不成功的概率相同,即Pi=1/2n, ASL = nP1+(n-1)P2+.+2Pn-1+Pn+(n+1)/2 = (n+1)*3/4,有序表的查

4、找:折半查找(Binary Search),确定待查记录的区间,逐步缩小范围直到找到或找不到该记录为止。 例子: 数据元素有序表如下,查找关键字key=21的数据元素。 21(05,13,19,21,37,56,64,75,80,88,92) 下标: 0 1 2 3 4 5 6 7 8 9 10 11 05,13,19,21,37,56,64,75,80,88,92 low mid high mid = (low+high)/2; key=ST.elemmid.key查找成功; 当keyST.elemmid.key时下一个待查区间为mid+1,high,折半查找的性能分析查找上例中所有元素的判

5、定二叉树为,判定树上每个结点需要的 查找次数刚好为该结点所 在的层数.,查找成功时查找次数不会 超过判定树的深度,n个结点的判定树的深度 为log2n+1.,折半查找的算法复杂度为 log2n+1,9.2 动态查找表9.2.1 二叉排序树,什么是二叉排序树(Binary Sort Tree) ? 二叉排序树是空树,或者是具有以下性质的二叉树: (1)若左子树非空,则左子树上所有结点的值均小于 它的根结点的值; (2)若右子树非空,则右子树上所有结点的值均大于 它的根结点的值; (3)它的左、右子树也分别为二叉排序树。,二叉排序树举例,查找过程: 从根结点出发,结点的值与key进行比较:(1)相

6、等时查找成功; (2)key较大时,沿右子树继续查找(无右子树表明查找失败); (3)key较小时,沿左子树继续查找(无左子树表明查找失败)。,其中序遍历序列: 3,12,24,37,45,53,61,78,90,100,二叉排序树的生成(插入结点),二叉排序树的生成(连续进行插入操作) 例如:对45,24,53,45,12,24,90 关键字序列的二叉排序树生成过程如下:,二叉排序树结点的删除(保持二叉排序树的特性及次序),设被删除的结点为*p,其父结点为*f,并不失一般性假设*p为*f的左孩子,则 (1)若*p为叶结点,即PL和PR均为空.直接删除不会影响树结构; (2)若*p只有PL或只

7、有PR.只要令PL或PR直接成为其双亲结点*f的左孩子即可,这样也不会影响树结构; (3)若*p有PL也有PR.为保持中序遍历二叉树的序列不变,可以有两种处理方法:其一是令PL为*f的左子树,PR为*s的右子树(*s为中序遍历PL的最后一个结点);其二是令*p的直接前驱(或直接后继)*s替代*p,然后删除直接前驱(或直接后继)*s.若*s有左孩子则左孩子取代*s的位置.这样虽然影响了树结构,但不会影响中序遍历二叉树时的结点次序.,在二叉排序树中删除结点*p,二叉排序树的查找分析,n个结点的二叉排序树的平均查找长度和树的形态有关45,24,53,45,12,37,93 最坏情况是二叉排序树蜕变单

8、支树:12,24,37,45, 53,93,ASL = O(log2n),ASL = O(n/2),二叉排序树举例(题目),已知如下所示长度为12的表 (Jan,Fab,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec) (1)试按表中元素的顺序依次插入一棵初始为空的二叉排序树,画出插入插入完成之后的二叉排序树,并求其在等概率的情况下查找成功的平均查找长度ASL; (2)若对表中元素先进行排序构成有序表,求其在等概率的情况下对此有序表进行折半查找时查找成功的平均查找长度;,二叉排序树举例(解答1),(Jan,Fab,Mar,Apr,May,June,July,

9、Aug,Sep,Oct,Nov,Dec),二叉排序树,其在等概率(1/12)的情况下查找成功的平均查找长度:,ASL=(1+2*2+3*3+4*3+5*2+6*1)/12 = 42/12 = 3.5,二叉排序树举例(解答2),(Apr,Aug,Dec,Fab,Jan,July,June,Mar,May,Nov,Oct,Sep),其在等概率(1/12)的情况下查找成功的平均查找长度:,ASL=(1+2*2+3*4+4*5)/12 = 37/12 = 3.1,9.2.2 平衡二叉树,什么是平衡二叉树(Balanced Binary Tree) ? 平衡二叉树是空树,或者是具有以下性质的二叉树: 它

10、的左子树和右子树也都是平衡二叉树并且 左子树和右子树的深度之差的绝对值不超过1 结点的平衡因子BF(Balance Factor)是 左子树的深度减去右子树的深度,它只可能是 -1, 0, 1 平衡二叉树(也称AVL树)的深度为O(log N)(其中N为结点个数) 它的平均查找长度也是O(log N),平衡二叉树及平衡因子举例,平衡的二叉树,不平衡的二叉树,不平衡二叉树及平衡因子举例,二叉排序树转成平衡树示例设关键字序列为(13,24,37,90,53),0 13,-1 13,0 24,0 37,0 13,-2 13,-1 24,0 24,0 37,0 53,0 13,0 13,0 37,0 90,0 53,-1 24,1 90,-2 37,-2 24,(a),(b),(c),(d),(e),(f),(g),(h),24,13,37,53,90,二叉排序树转成平衡树失去平衡后进行调整的四种情况,(1)单向右旋平衡处理 当在左子树上插入左结点,使平衡因子由1增至2时 (2)单向左旋平衡处理(上例从图(d)到图(e) 当在右子树上插入右

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论