软件技术基础3_1要领.pptVIP

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * * * * * * * * * * 三、算法评价 优点: ASL ?log2n; 即每经过一次比较,查找范围就缩 小一半。经log2n次比较就可以完成查找过程。 缺点:因要求有序,所以对所有数据元素按大小排序是非常费时的操作。另外,顺序存储结构的插入、删除操作不大便利。 考虑: 能否一次比较抛弃更多的部分(即一次比较,使查找范围缩得更小),以达到提高效率的目的; ……? 把两种方法(顺序查找和二分查找)结合起来,即取顺序查找简单和二分查找高效之所长,来达到提高效率的目的? 3.1.3 分块查找 分块查找又称索引顺序查找,这是顺序查找的一种改进方法,用于在分块有序表中进行查找 。 (1)分块:将n个数据元素“按块有序”划分为m块(m ? n)。每一块中的结点不必有序,但块与块之间必须“按块有序”;即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……。每个块中元素不一定是有序的。 一、分块查找算法描述 1.算法描述: step1 先选取各块中的最大关键字构成一个索引表; step2 查找分两个部分: 先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中; 在已确定的块中用顺序法进行查找。 2.分块查找数据描述 将查找表分成3块,每块3个元素 8 36 60 1 4 7 块最大关键字 块起始地址 索引表 块最大关键字有序 3 8 7 36 35 21 40 60 1 2 3 4 5 6 7 8 9 47 索引 顺序表 块内关键字无序(也可有序) 分块查找举例 有数列如下: { 22,12,13,9,8,33,42,44,38,24,48,60,58,74,47} 按“块有序”分三块:(22,12,13,9,8),(33,42,44,38,24), (48,60,58,74,47)。选取每块中最大的关键字组成索引表[22,44,74],查找关键字值为60的元素。 用二分法,确定在索引表中的位置为 mid=2,key值60与a[2]比较,60a[2],取第3个块;在第3块中用顺序法查找,比较两次,就可以找出60的元素来。 44 22 74 22 12 13 9 8 33 42 44 38 24 48 60 58 74 47 List[1] List[2] List[3] 11 12 13 14 15 1 6 11 二、索引表结构定义 #include stdio.h typedef struct { int key; /* 块中元素最大值 */ int link; /* 指向块入口地址 */ } index; index_seq_search(index ls[],int s[],int m,int key,int l) { int i,j,block_end; i=0; while(im keyls[i].key) i++; /* 确定在哪块查找 */ if(i=m) { printf(“ Searching failure\n); return(-1); } else /* 否则,查找成功处理 */ 三、分块查找算法(c语言) ls[] 索引表 S[] 待查表 M 块数 key 要找的值 l 块长度 { j=ls[i].link; /* 块入口地址 */ if(j == m-1) block_end = n; else block_end = ls[i+1].link-1; while (key !=s[j] j = block_end ) j++; if(key==s[j] j = block_end )/* 查找成功*/ { printf(Successful search\n”); return(j); } else /* 查找失败 */ { printf(Searching failure\n); return(-1); } } } /* 结束 */ 四、算法评价 其中:n为表长,S为块长(假设各块长度相等)。 优点: 插入、删除操作方便; 只要找到对应的块,在块中任意位置操作均可。 缺点: 索引表增加

文档评论(0)

xiaofei2001129 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档