版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 - 静态查找表静态查找表若表中存在特定元素,称查找成功,应输出该记录;若表中存在特定元素,称查找成功,应输出该记录;否则,称查找不成功(也应输出失败标志或失败位置)否则,称查找不成功(也应输出失败标志或失败位置)查找表查找表 查查 找找查找成功查找成功查找不成功查找不成功静态查找表静态查找表动态查找表动态查找表关键字关键字主关键字主关键字次关键字次关键字由同一类型的数据元素(或记录)构成的集合。由同一类型的数据元素(或记录)构成的集合。查询查询(Searching)特定元素特定元素是否在表中。是否在表中。只查找,不改变集合内的数据元素。只查找,不改变集合内的数据元素。既查找,又改变(增减)集
2、合内的数据元素。既查找,又改变(增减)集合内的数据元素。记录中某个数据项的值,可用来识别一个记录记录中某个数据项的值,可用来识别一个记录 ( 预先确定的记录的某种标志预先确定的记录的某种标志 ) 可以可以唯一唯一标识一个记录的关键字标识一个记录的关键字例如例如“学号学号”例如例如“女女”识别若干记录的关键字识别若干记录的关键字(2)对查找表常用的操作有)对查找表常用的操作有哪些?哪些? v查询某个查询某个“特定的特定的”数据元素是否在表中;数据元素是否在表中;v查询某个查询某个“特定的特定的”数据元素的各种属性;数据元素的各种属性;v在查找表中插入一元素;在查找表中插入一元素;v从查找表中删除
3、一元素。从查找表中删除一元素。 (3) 有哪些查找方法?有哪些查找方法? 查找方法取决于表中数据的排列方式查找方法取决于表中数据的排列方式;(1)查找的过程是怎样的?)查找的过程是怎样的? 给定一个值给定一个值K K,在含有,在含有n n个记录的文件中进行搜索,寻找个记录的文件中进行搜索,寻找一个关键字值等于一个关键字值等于K K的记录,如找到则输出该记录,否则输出的记录,如找到则输出该记录,否则输出查找不成功的信息。查找不成功的信息。针对静态查找表和动态查找表的查找方法也有所不同针对静态查找表和动态查找表的查找方法也有所不同。明确:明确:查找的过程就是将给定的查找的过程就是将给定的K K值与
4、文件中各记录的关键字值与文件中各记录的关键字项进行比较的过程。所以用比较次数的平均值来评估算法的优项进行比较的过程。所以用比较次数的平均值来评估算法的优劣。称为劣。称为平均查找长度平均查找长度(ASLASL:average search lengthaverage search length)。)。其中:其中:n n是文件记录个数;是文件记录个数;P Pi i是查找第是查找第i i个记录的查找概率(通常取等概率个记录的查找概率(通常取等概率, ,即即P Pi i =1/n =1/n); ;C Ci i是找到第是找到第i i个记录时所经历的比较次数。个记录时所经历的比较次数。统计意义上的统计意义
5、上的数学期望值数学期望值物理意义:物理意义:假设每一元素被查找的概率相同,则查找每假设每一元素被查找的概率相同,则查找每一元素所需的比较次数之总和再取平均,即为一元素所需的比较次数之总和再取平均,即为ASLASL。显然,显然,ASLASL值越小,时间效率越高。值越小,时间效率越高。 (4)如何评估查找方法的优劣?)如何评估查找方法的优劣?1niiiASLP C针对静态查找表的查找算法主要有:针对静态查找表的查找算法主要有: 静态查找表的顺序存储结构参见教材静态查找表的顺序存储结构参见教材P216。一、顺序查找(线性查找)一、顺序查找(线性查找)二、折半查找(二分或对分查找)二、折半查找(二分或
6、对分查找)三、静态树表的查找三、静态树表的查找四、分块查找(索引顺序查找)四、分块查找(索引顺序查找)(1)顺序表的机内存储结构:顺序表的机内存储结构:typedef struct ElemType *elem; /表基址,表基址,0 0号单元留空。表容量为全部元素号单元留空。表容量为全部元素 int length; /表长,即表中数据元素个数表长,即表中数据元素个数SSTable;顺序查找:即用逐一比较的办法顺序查找关键字,这显然是最顺序查找:即用逐一比较的办法顺序查找关键字,这显然是最直接的办法。直接的办法。 v 对对顺序结构顺序结构如何线性查找?如何线性查找?见下页之例见下页之例或教材或
7、教材P216P216;v 对对单链表结构单链表结构如何线性查找?函数虽未给出,但也很容易如何线性查找?函数虽未给出,但也很容易编写;只要知道头指针编写;只要知道头指针headhead就可以就可以“顺藤摸瓜顺藤摸瓜”;v 对对非线性树结构非线性树结构如何顺序查找如何顺序查找? ?可借助各种遍历操作!可借助各种遍历操作!技巧:技巧:把待查关键字把待查关键字keykey存入表头或表尾(俗称存入表头或表尾(俗称“哨兵哨兵”),),这样可以加快执行速度。这样可以加快执行速度。例:例:若将待查找的特定值若将待查找的特定值keykey存入存入顺序表的顺序表的首部首部(如(如0 0号单号单元),则顺序查找的实
8、现方案为:元),则顺序查找的实现方案为:从后向前从后向前逐个比较!逐个比较!int Search_Seq( SSTable ST , KeyType key ) /在顺序表在顺序表STST中,查找关键字与中,查找关键字与keykey相同的元素;若成功,返回其位相同的元素;若成功,返回其位置信息,否则返回置信息,否则返回0 0 ST.elem0.key =key; /设立哨兵,可免去查找过程中每一步设立哨兵,可免去查找过程中每一步都要检测是否查找完毕。当都要检测是否查找完毕。当n1000n1000时,查找时间将减少一半。时,查找时间将减少一半。 for( i=ST.length; ST.elem
9、 i .key!=key; - - i ); /不要用不要用for(i=n; i0; - -i) for(i=n; i0; - -i) 或或 for(i=1; i=n; i+)for(i=1; i=n; i+) return i; /若到达若到达0 0号单元才结束循环,说明不成功,返回号单元才结束循环,说明不成功,返回0 0值值(i=0)(i=0)。成功时则返回找到的那个元素的位置成功时则返回找到的那个元素的位置i i。 / Search_Seq技巧:技巧:把待查关键字把待查关键字keykey存入表头或表尾(俗称存入表头或表尾(俗称“哨兵哨兵”),),这样可以加快执行速度。这样可以加快执行速度
10、。例:例:若将待查找的特定值若将待查找的特定值keykey存入存入顺序表的顺序表的首部首部(如(如0 0号单号单元),则顺序查找的实现方案为:元),则顺序查找的实现方案为:从后向前从后向前逐个比较!逐个比较!int Search_Seq( SSTable ST , KeyType key )ST.elem0.key =key; for( i=ST.length; ST.elem i .key!=key; - - i ); return i; / Search_Seq返回特殊标志,例如返回空记录或空指针。前例中设立了返回特殊标志,例如返回空记录或空指针。前例中设立了“哨哨兵兵”,就是将关键字送入
11、末地址,就是将关键字送入末地址ST.elemST.elem0 0.key.key使之结束并返回使之结束并返回 i=0i=0。讨论讨论 查找效率怎样计算?查找效率怎样计算?用平均查找长度用平均查找长度ASL衡量。衡量。讨论讨论 如何计算如何计算ASL?分析:分析:查找第查找第n个元素所需的比较次数为个元素所需的比较次数为1;查找第查找第n-1个元素所需的比较次数为个元素所需的比较次数为2;查找第查找第1个元素所需的比较次数为个元素所需的比较次数为n;总计全部比较次数为:总计全部比较次数为:12n = (1+n)n/2未考虑查找不成功的未考虑查找不成功的情况:查找哨兵所需情况:查找哨兵所需的比较次
12、数为的比较次数为n+1n+1这是查找成功的情况这是查找成功的情况若求某一个元素的平均查找次数,还应当除以若求某一个元素的平均查找次数,还应当除以n(等概率),(等概率),即:即: ASL(1n)/2 ,时间效率为,时间效率为 O(n)优点:优点:算法简单,且对顺序结构或链表结构均适用。算法简单,且对顺序结构或链表结构均适用。缺点:缺点: ASL 太长,时间效率太低。太长,时间效率太低。这是一种容易想到的查找方法。这是一种容易想到的查找方法。先给数据排序先给数据排序(例如按升序排好),形成(例如按升序排好),形成有序表有序表,然后再将,然后再将keykey与正中元素相比,若与正中元素相比,若ke
13、ykey小,则缩小至右半部内查找;再取其中小,则缩小至右半部内查找;再取其中值比较,每次缩小值比较,每次缩小1/21/2的范围,直到查找成功或失败为止。的范围,直到查找成功或失败为止。v 对对顺序表结构顺序表结构如何编程实现折半查找算法?如何编程实现折半查找算法? 见下页之例见下页之例,或见教材(,或见教材(P219P219)v 对对单链表结构单链表结构如何折半查找?如何折半查找? 无法实现!无法实现!因全部元素的定位只能从头指针因全部元素的定位只能从头指针headhead开始开始v 对对非线性非线性(树树)结构结构如何折半查找?如何折半查找? 可借助二叉排序树来查找(属动态查找表形式)。可借
14、助二叉排序树来查找(属动态查找表形式)。 如何改进?如何改进?讨论讨论 顺序查找的特点:顺序查找的特点: 运算步骤运算步骤:(1) low =1,high =11 ,mid =6 (1) low =1,high =11 ,mid =6 ,待查范围是,待查范围是 1,111,11;(2) (2) 若若 ST.elemmid.key ST.elemmid.key key keykey,说明,说明keykey low ,midlow ,mid-1-1 , 则令:则令:high =mid1high =mid1; ;重算重算 mid mid ;(4)(4)若若 ST.elem mid .key ST.e
15、lem mid .key = key= key,说明查找成功,元素序号,说明查找成功,元素序号=mid;=mid;结束条件:结束条件: (1 1)查找成功)查找成功 : ST.elemmid.key = keyST.elemmid.key = key (2 2)查找不成功)查找不成功 : lowlowhigh (意即区间长度小于(意即区间长度小于0 0)解:解: 先设定先设定3个辅助标志个辅助标志: low,high,midlow,high,mid,LowLow指向待查元素指向待查元素所在区间的下界所在区间的下界highhigh指向待查元素所指向待查元素所在区间的上界在区间的上界midmid指
16、向待查元素所在指向待查元素所在区间的中间位置区间的中间位置 已知如下已知如下11个元素的个元素的有序表有序表:(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为请查找关键字为21 和和85的数据元素。的数据元素。显然有:显然有:mid= (low+high)/2 mjjj112典型标志是:当查找范围的上界典型标志是:当查找范围的上界下界时停止查找。下界时停止查找。讨论讨论 二分查找的效率(二分查找的效率(ASLASL)1次比较就查找成功的元素有次比较就查找成功的元素有1个个(20),即),即中间值;中间值;2次比较就查找成功的元素有次比较就查找成功的元素有2
17、个个(21),即),即1/4处(或处(或3/4)处;)处;3次比较就查找成功的元素有次比较就查找成功的元素有4个个(22),即),即1/8处(或处(或3/8)处)处 4次比较就查找成功的元素有次比较就查找成功的元素有8个个(23),即),即1/16处(或处(或3/16)处)处 则第则第m次比较时查找成功的元素会有次比较时查找成功的元素会有(2m-1)个个;为方便起见,假设表中全部为方便起见,假设表中全部n个元素个元素 2m-1个,个,此时就不讨论第此时就不讨论第m次比较后还有剩余元素的情况了。次比较后还有剩余元素的情况了。全部比较总次数为全部比较总次数为120221322423m2m1 推推导
18、导过过程程(详细推导过程见教材(详细推导过程见教材P221的附录的附录1)课堂练习课堂练习(多项选择):(多项选择):采用链式存贮结构采用链式存贮结构 记录的长度记录的长度128 采用顺序存贮结构采用顺序存贮结构 记录按关键字递增有序记录按关键字递增有序nnnnjnASLmjj2211log1) 1(log121使用折半查找算法时,要求被查文件:使用折半查找算法时,要求被查文件:思考:思考:假设在有序线性表假设在有序线性表a20上进行折半查找,则上进行折半查找,则平均查找长度为平均查找长度为 。查找过程可用查找过程可用二叉树二叉树描述:每个记录用一个结点表示;描述:每个记录用一个结点表示;结点
19、中值为该记录在表中位置,这个描述查找过程的二结点中值为该记录在表中位置,这个描述查找过程的二叉树称为判定树。叉树称为判定树。n个元素的表的折半查找的判定树是唯个元素的表的折半查找的判定树是唯一的,即:判定树由表中元素个数决定。一的,即:判定树由表中元素个数决定。 找到有序表中任一记录的过程就是找到有序表中任一记录的过程就是:走了一条从根结点:走了一条从根结点到与该记录相应的结点的路径。到与该记录相应的结点的路径。 比较的关键字个数:比较的关键字个数:为该结点在判定树上的层次数。为该结点在判定树上的层次数。 查找成功时查找成功时比较的关键字个数最多不超过树的深度比较的关键字个数最多不超过树的深度
20、 d : d = log2 n + 1 若所有结点的空指针域设置为一个指向一个方形结点的若所有结点的空指针域设置为一个指向一个方形结点的指针,称方形结点为判定树的外部结点;对应的,圆形指针,称方形结点为判定树的外部结点;对应的,圆形结点为内部结点。结点为内部结点。 查找不成功的过程查找不成功的过程 就是走了一条从根结点到外部结点就是走了一条从根结点到外部结点的路径。的路径。这是一种顺序查找的另一种改进方法。这是一种顺序查找的另一种改进方法。先让数据先让数据分块有序分块有序,即分成若干子表,要求每个子表中的,即分成若干子表,要求每个子表中的关关键字的键字的值都比后一值都比后一子表要子表要小(但子表内部未必有序)。小(但子表内部未必有序)。然后将各子表中的最大关键字构成一个然后将各子表中的最大关键字构成一个索引表索引表,表中还要包,表中还要包含每个子表的起始地址(即头指针)。含每个子表的起始地址(即头指针)。索引表索引表最大关键字起始地址22 12 138920 33 42 44 38 24 48 60 58 74 49 86 53第第1 1块块第第2 2块块第第3 3块块224886例:例:2248861713特点:块间有特点:块间有序,块内无序序,块内无序 对索引表使用折半查找法(因为索引表是有序表);对索引表使用折半查找法(因为索引表是有序表);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 货车自燃事故报告范文
- 顺丰整改报告范文
- 酒店调研报告范文
- 工作情况整改报告范文
- 2025年鹰潭货运从业资格证考试
- 2025年吉林货运从业资格证试题库及答案解析
- 《操作系统OS》课件
- 2025民间私人借款合同模板
- 2025临时工协议合同范本广州
- 2025山林转让合同
- 尿动力学检查操作指南2023版
- GB/T 27806-2011环氧沥青防腐涂料
- GB/T 14124-2009机械振动与冲击建筑物的振动振动测量及其对建筑物影响的评价指南
- GB/T 11170-2008不锈钢多元素含量的测定火花放电原子发射光谱法(常规法)
- 最新《工会基础知识》试题库及答案1000题【完美打印版】
- 2023年现行建筑施工规范目录
- 心态管理与销售技巧
- 工程变更联系单【范本模板】
- 《网络传播学概论》(第四版)-课件
- hsk教程5上练习册
- 五年级《欧洲民间故事》知识考试题库(含答案)
评论
0/150
提交评论