西华师大 滕华.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章 查 找 西华师大 滕华 9.1静态查找表(ADT) 9.1.1顺序表的查找(逻辑结构为线性表) 顺序查找: ASL=ΣPiCi 折半查找: ASL=log2(n+1)-1 //有序表 索引查找: ASL=Lb+Lw=1/2(n/s+s)+1 //块有序 性能分析 平均查找长度: 9.2 动态查找表 9.2.1二叉排序树和二叉平衡树 查找 顺序查找是一种最基本和最简单的查找方法。它的思路是,从表中的第一个元素开始,将给定的值与表中逐个元素的关键字进行比较,直到两者相符,查到所要找的元素为止。否则就是表中没有要找的元素,查找不成功。对于表中记录的关键字是无序的表,只能采用这种方法。描述顺序查找的算法见框图8-1。其中n是表r的长度,k是要查的元素的关键字,i查到的元素的序号。 折半查找又称二分查找,是针对有序表进行查找的简单、有效而又较常用的方法。所谓有序表,即要求表中的各元素按关键字的值有序(升序或降序)存放。 折半查找不像顺序查找那样,从第一个记录开始逐个顺序搜索,其基本思想是:首先选取表中间位置的记录,将其关键字与给定关键字k进行比较,若相等,则查找成功;否则,若k值比该关键字值大,则要找的元素一定在表的后半部分(或称右子表),则继续对右子表进行折半查找;若k值比该关键字值小,则要找的元素一定在表的前半部分(左子表),同样应继续对左子表进行折半查找。每进行一次比较,要么找到要查找的元素,要么将查找的范围缩小一半。如此递推,直到查找成功或把要查找的范围缩小为空(查找失败)。 设表的长度为n,表的被查找部分的头为low,尾为high,初始时,low=1,high=n,k为关键字的值。 (2)若k=r[mid].key,成功,否则: 若 kr[mid].key, 则high=mid―1,重复(1); 若kr[mid].key, 则low=mid+1,重复(1); 直到成功或不成功(此时lowhigh)。 具体算法如下: Void binsrch(struct node r[ ],int n,int k) { int mid,low,high,find; low=1; high=n;find=0; /*置区间初值*/ while ((low=high) (!find)) { mid=(low+high)/2; /*求中点*/ if (k= = r[mid].key) find=1; /*已查到*/ else if(kr[mid].key ) low=mid+1; /*在后半区间查找*/ else high=mid-1; /*在前半区间查找*/ } if (find) return (mid); /*查找成功,返回找到元素的位置*/ else return (0); /*查找不成功,返回0标记*/ } 采用折半查找,当查找成功时,最少比较次数为一次,如在上例中查找关键字值为18的结点,只需一次比较。最多经过log2n次比较之后,待查找子表要么为空,要么只剩下一个结点,所以要确定查找失败需要log2n次或log2n+1次比较。可以证明,折半查找的平均查找长度是: 从折半查找的平均查找长度ASL来看,当表的长度n很大时,该方法尤其能显示出其时间效率。但由于折半查找的表仍是线性表,若经常要进行插入、删除操作,则元素排列费时太多,因此折半查找比较适合于一经建立就很少改动而又需要经常查找的线性表,较少查找而又经常需要改动的线性表可以采用链接存储,使用顺序查找。 分块查找 在处理线性表时,如果既希望能够快速查找,又要经常动态变化,则可以采用分块查找方法。分块查找又称索引顺序查找,要求将待查的元素均匀的分成块,块间按大小排序,块内不排序。因此需要建立一个块的最大(或最小)关键字表,称之为“索引表”。 具体而言,假设我们按结点元素关键字升序方式组织表中各块,则要求第一块中任一结点的关键字值都小于第二块中所有结点的关键字值;第二块中任一结点的关键字值都小于第三块中所有结点的关键字值;如此类推。然后选择每块中的最大(或最小)关键字值组成索引表。换言之,索引表中的结点个数等于线性表被分割的块数。 例如要找关键字为k的元素,则先用折半查找法由索引表查出k所在的块,再用顺序查找法在对应的块中找出k。在图8-2中若要找关键字值为41的元素,则先由索引表查出41在第二块中(294164),再在第二块中找到41。 由

文档评论(0)

dart001 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档