软件技术基础第03章查找.ppt
《软件技术基础第03章查找.ppt》由会员分享,可在线阅读,更多相关《软件技术基础第03章查找.ppt(50页珍藏版)》请在三一办公上搜索。
1、第 1 页,思考问题,数据存放在计算机中如何查找?查找方法有所不同吗?不同方法的查找效率有区别吗?基本的查找方式有几种?,第 2 页,教学目标,了解有关查找的基本概念查找的主要算法,第 3 页,教学要求,通过本单元的学习,了解、掌握有关查找的:基本概念查找、平均查找长度主要查找算法顺序查找、折半查找、分块查找哈希查找,第 4 页,本单元涉及的内容,第3章3.1 基本的查找技术 3.2 哈希表技术,第 5 页,一、基本概念,查找查找表静态查找动态查找平均查找长度,第 6 页,查找,查找 就是在给定的DS中找出满足某种条件的结点;若存在这样的结点,查找成功;否则,查找失败。查找表 是一组待查数据元
2、素的集合。静态查找 是仅仅进行查询和检索操作,不改变查找表中数据元素间的逻辑关系的查找。动态查找 是除了进行查询和检索操作外,还对查找表进行插入、删除操作的查找,动态地改变查找表中数据元素之间的逻辑关系。,第 7 页,平均查找长度,平均查找长度(ASL-Average Search Length)在查找过程中,对每个结点记录中的关键字要进行反复比较,以确定其位置。因此,与关键字进行比较的平均次数,就成为平均查找长度。它是用来评价一个算法好坏的一个依据。对含有n个数据元素的查找表,查找成功时的平均查找长度为:,其中:Pi 为查找表中第i个数据元素的概率,且,Ci为查找到第i个数据元素时需进行比较
3、的次数。显然,Ci随查找过程及DS的不同而各异。,第 8 页,基本的查找技术,顺序查找折半查找分块查找,第 9 页,1.顺序查找,算法思想:最古老的算法。从第1个元素到最后1个元素,逐个进行比较。查找表的存储结构既适用于顺序存储结构也适用于链式存储结构 算法描述算法讨论,第 10 页,算法描述,查找操作步骤:step1 从第1个元素开始查找;step2 用待查关键字值与各结点(记录)的关键字值逐个进行比较;若找到相等的结点,则查找成功;否则,查找失败。,第 11 页,顺序查找算法,seq_search(int*item,n,key)int i=0;while(i n,第 12 页,顺序查找算法
4、(改进算法),seq_search_adv(int*item,n,key)int i=0;itemn=key;/*设置哨兵*/while(itemi!=key)i+;/*查找key*/if(i n)/*如果 i=n,没找到*/printf(“查找成功!n”);return(i);else printf(“查找失败!n”);return(-1);注:设置哨兵目的在于免去查找过程中每一步都要检测整个表是否查完 顺序查找算法中,执行频率最高的是while语句,改进后,可以节省近一半的时间,第 13 页,顺序查找算法主程序,#include“stdio.h”#define n 7 main()int
5、key,loc=0;int a10=43,15,21,37,2,5,82;printf(“Input key:”);scanf(“%d”,第 14 页,算法讨论,平均查找长度ASL在等概率的情况下,平均查找长度ASL在等概率的情况下,优点:对结点的逻辑次序(不必有序)和存储结构(顺序、链表均可)无要求;当序列中的记录“基本有序”或N值较小时,是较好的算法;缺点:ASL较长讨论:能否减少比较次数,以提高效率。,例如,,二分法等,第 15 页,2.折半查找,算法思想:将有序数列的中点设置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。即通过一次比较,将查找区
6、间缩小一半。二分查找的先决条件是查找表中的数据元素必须有序。,第 16 页,算法描述,算法步骤:step1 首先确定整个查找区间的中间位置,mid=(left+right)/2step2 用待查关键字值与中间位置的关键字值进行比较;若相等,则查找成功;若大于,则在后半区域继续进行二分查找;若小于,则在前半区域继续进行二分查找。对确定的缩小区域再按二分公式,重复上述步骤;最后,得到结果:要么,查找成功,要么,查找失败。存储结构用一维数组存放。,第 17 页,折半查找算法举例,对给定数列(有序)3,5,11,17,21,23,28,30,32,50,按折半查找算法,查找关键字值为30的数据元素。,
7、第二次:23,28,30,32,50,mid1=(1+10)/2=5,mid2=(6+10)/2=8,第 18 页,折半查找算法,bin_search(item,n,key)int*item,n,key;int left,right,mid;left=0;right=n-1;while(left right)mid=(left+right)/2;/*计算中点位置*/if(key itemmid)left=mid+1;/*待查区间在右部*/else printf(“Successful searchn”);return mid;/*查找成功*/printf(“Search failure n”)
8、;return-1;/*查找失败*/,第 19 页,折半查找算法的主程序,#define“stdio.h”int num;main()int res,key;int s10=1,3,5,7,9,11,13,15,17,19,21,23;res=b_search(s,12,7);if(res0)printf(res=%d,num=%dn,res+1,num);else printf(“search failuren”);,第 20 页,算法分析,优点:ASL log2n;即每经过一次比较,查找范围就缩小一半。经log2n 次计较就可以完成查找过程。缺点:因要求有序,所以对所有数据元素按大小排序是
9、非常费时的操作。另外,顺序存储结构的插入、删除操作不大便利。考虑:能否一次比较抛弃更多的部分(即一次比较,使查找范围缩得更小),以达到提高效率的目的;?,把两种方法(顺序查找和二分查找)结合起来,即取顺序查找简单和二分查找高效之所长,来达到提高效率的目的?,第 21 页,3.分块查找,分块查找又称索引顺序查找,这是顺序查找的一种改进方法。方法描述:将n个数据元素“按块有序”划分为m块(m n)。每一块中的结点不必有序,但块与块之间必须“按块有序”;即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,。每个块中元素不一定是有序的。,第
10、22 页,分块查找算法描述,step1 先选取各块中的最大关键字构成一个索引表;step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;在已确定的块中用顺序法进行查找。,第 23 页,分块查找举例,有数列如下: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与a2比较,60a2
11、,取第3个块;在第3块中用顺序法查找,比较两次,就可以找出60的元素来。,第 24 页,索引表结构定义,#include stdio.htypedef struct int key;/*块最大值*/int link;/*指向块入口地址*/index;,第 25 页,index_seq_search.c子函数,index_seq_search(index ls,int s,int m,int key,int l)int i,j;i=0;while(ilsi.key)i+;/*确定在哪块查找*/if(i=m)printf(“Searching failuren);return(-1);else/*
12、否则,查找成功处理*/,第 26 页,分块查找子函数(续),j=lsi.link;/*块入口地址*/while(key!=sj/*结束*/,第 27 页,分块查找主函数,main()index ls5=14,0,34,5,66,10,85,15,100,20;int a=8,4,3,2,14,34,20,17,28,29,58,61,59,66,48,81,80,79,83,69,89,100,96,86,87;int i,j=0,key;for(i=0;i25;i+)if(j=0)printf();if(j=5)printf();j=0;printf();printf(%4d,ai);j+;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件技术 基础 03 查找

链接地址:https://www.31ppt.com/p-6610955.html