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