您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > 2015_12_SHI_DS_查找.
1数据结构——WithC/C++主讲教师:石振锋哈尔滨工业大学数学系2015年秋数学系计算数学教研室数据结构Ch02No.2数据结构课程的内容数学系计算数学教研室数据结构Ch02No.3第八章查找8.1基本概念8.2静态查找表8.3动态查找表8.4哈希表数学系计算数学教研室数据结构Ch02No.48.1基本概念——若表中存在特定元素,称查找成功,应输出该记录;——否则,称查找不成功(也应输出失败标志或失败位置)查找表查找查找成功查找不成功静态查找动态查找关键字主关键字次关键字——由同一类型的数据元素(或记录)构成的集合。——查询(Searching)特定元素是否在表中。——只查找,不改变集合内的数据元素。——既查找,又改变(增减)集合内的数据元素。——记录中某个数据项的值,可用来识别一个记录(预先确定的记录的某种标志)——可以唯一标识一个记录的关键字例如“学号”例如“女”是一种数据结构——识别若干记录的关键字数学系计算数学教研室数据结构Ch02No.5(2)对查找表常用的操作有哪些?查询某个“特定的”数据元素是否在表中;查询某个“特定的”数据元素的各种属性;在查找表中插入一元素;从查找表中删除一元素。(3)有哪些查找方法?查找方法取决于表中数据的排列方式;讨论:(1)查找的过程是怎样的?给定一个值K,在含有n个记录的文件中进行搜索,寻找一个关键字值等于K的记录,如找到则输出该记录,否则输出查找不成功的信息。例如查字典针对静态查找表和动态查找表的查找方法也有所不同。“特定的”=关键字数学系计算数学教研室数据结构Ch02No.6(4)如何评估查找方法的优劣?明确:查找的过程就是将给定的K值与文件中各记录的关键字项进行比较的过程。所以用比较次数的平均值来评估算法的优劣。称为平均查找长度(ASL:averagesearchlength)。其中:n是文件记录个数;Pi是查找第i个记录的查找概率(通常取等概率,即Pi=1/n);Ci是找到第i个记录时所经历的比较次数。统计意义上的数学期望值物理意义:假设每一元素被查找的概率相同,则查找每一元素所需的比较次数之总和再取平均,即为ASL。显然,ASL值越小,时间效率越高。1niiiASLPC数学系计算数学教研室数据结构Ch02No.7针对静态查找表的查找算法主要有:8.2静态查找表静态查找表的抽象数据类型参见教材P216。一、顺序查找(线性查找)二、折半查找(二分或对分查找)三、静态树表的查找四、分块查找(索引顺序查找)数学系计算数学教研室数据结构Ch02No.8一、顺序查找(Linearsearch,又称线性查找)(1)顺序表的机内存储结构:typedefstruct{ElemType*elem;//表基址,0号单元留空。表容量为全部元素intlength;//表长,即表中数据元素个数}SSTable;顺序查找:即用逐一比较的办法顺序查找关键字,这显然是最直接的办法。对顺序结构如何线性查找?见下页之例或教材P216;对单链表结构如何线性查找?函数虽未给出,但也很容易编写;只要知道头指针head就可以“顺藤摸瓜”;对非线性树结构如何顺序查找?可借助各种遍历操作!数学系计算数学教研室数据结构Ch02No.9(2)算法的实现:技巧:把待查关键字key存入表头或表尾(俗称“哨兵”),这样可以加快执行速度。例:若将待查找的特定值key存入顺序表的首部(如0号单元),则顺序查找的实现方案为:从后向前逐个比较!intSearch_Seq(SSTableST,KeyTypekey){//在顺序表ST中,查找关键字与key相同的元素;若成功,返回其位置信息,否则返回0ST.elem[0].key=key;//设立哨兵,可免去查找过程中每一步都要检测是否查找完毕。当n1000时,查找时间将减少一半。for(i=ST.length;ST.elem[i].key!=key;--i);//不要用for(i=n;i0;--i)或for(i=1;i=n;i++)returni;//若到达0号单元才结束循环,说明不成功,返回0值(i=0)。成功时则返回找到的那个元素的位置i。}//Search_Seq数学系计算数学教研室数据结构Ch02No.10——返回特殊标志,例如返回空记录或空指针。前例中设立了“哨兵”,就是将关键字送入末地址ST.elem[0].key使之结束并返回i=0。讨论②查找效率怎样计算?——用平均查找长度ASL衡量。讨论①查不到怎么办?讨论③如何计算ASL?分析:查找第1个元素所需的比较次数为1;查找第2个元素所需的比较次数为2;……查找第n个元素所需的比较次数为n;总计全部比较次数为:1+2+…+n=(1+n)n/2未考虑查找不成功的情况:查找哨兵所需的比较次数为n+1这是查找成功的情况若求某一个元素的平均查找次数,还应当除以n(等概率),即:ASL=(1+n)/2,时间效率为O(n)数学系计算数学教研室数据结构Ch02No.11二、折半查找(又称二分查找或对分查找)优点:算法简单,且对顺序结构或链表结构均适用。缺点:ASL太长,时间效率太低。这是一种容易想到的查找方法。先给数据排序(例如按升序排好),形成有序表,然后再将key与正中元素相比,若key小,则缩小至右半部内查找;再取其中值比较,每次缩小1/2的范围,直到查找成功或失败为止。对顺序表结构如何编程实现折半查找算法?——见下页之例,或见教材(P219)对单链表结构如何折半查找?——无法实现!因全部元素的定位只能从头指针head开始对非线性(树)结构如何折半查找?——可借助二叉排序树来查找(属动态查找表形式)。如何改进?讨论④顺序查找的特点:数学系计算数学教研室数据结构Ch02No.12②运算步骤:(1)low=1,high=11,mid=6,待查范围是[1,11];(2)若ST.elem[mid].keykey,说明key[mid+1,high],则令:low=mid+1;重算mid=(low+high)/2;.(3)若ST.elem[mid].keykey,说明key[low,mid-1],则令:high=mid–1;重算mid;(4)若ST.elem[mid].key=key,说明查找成功,元素序号=mid;结束条件:(1)查找成功:ST.elem[mid].key=key(2)查找不成功:high≤low(意即区间长度小于0)解:①先设定3个辅助标志:low,high,mid,折半查找举例:Low指向待查元素所在区间的下界high指向待查元素所在区间的上界mid指向待查元素所在区间的中间位置已知如下11个元素的有序表:(0513192137566475808892),请查找关键字为21和85的数据元素。显然有:mid=(low+high)/2数学系计算数学教研室数据结构Ch02No.13mjjj112讨论①若关键字不在表中,怎样得知和停止?——典型标志是:当查找范围的上界≤下界时停止查找。讨论②二分查找的效率(ASL)1次比较就查找成功的元素有1个(20),即中间值;2次比较就查找成功的元素有2个(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次比较后还有剩余元素的情况了。全部比较总次数为1×20+2×21+3×22+4×23…+m×2m—1=推导过程数学系计算数学教研室数据结构Ch02No.14平均每个数据的查找时间还要除以n,所以:(详细推导过程见教材P221的附录1)课堂练习(多项选择):A.采用链式存贮结构B.记录的长度≤128C.采用顺序存贮结构D.记录按关键字递增有序√√nnnnjnASLmjj2211log1)1(log121使用折半查找算法时,要求被查文件:思考:假设在有序线性表a[20]上进行折半查找,则平均查找长度为。数学系计算数学教研室数据结构Ch02No.15查找过程可用二叉树描述:每个记录用一个结点表示;结点中值为该记录在表中位置,这个描述查找过程的二叉树称为判定树。n个元素的表的折半查找的判定树是唯一的,即:判定树由表中元素个数决定。找到有序表中任一记录的过程就是:走了一条从根结点到与该记录相应的结点的路径。比较的关键字个数:为该结点在判定树上的层次数。•查找成功时比较的关键字个数最多不超过树的深度d:d=log2n+1•若所有结点的空指针域设置为一个指向一个方形结点的指针,称方形结点为判定树的外部结点;对应的,圆形结点为内部结点。•查找不成功的过程就是走了一条从根结点到外部结点的路径。折半查找效率分析法2(参见教材P220):数学系计算数学教研室数据结构Ch02No.16三、静态树表的查找讨论2:当有序表中各记录的查找概率不相等时,该如何查找?首先要明确,此时用折半查找法未必最优!(参见教材P222例)改进:若将各记录概率看作是二叉树之权值,则转为研究带权路径长度最小的二叉树(类似最优二叉树)。讨论1:对有序表还有其他查找算法吗?静态最优查找树算法——时间代价高;实用算法:近似最优查找树(次优查找树)(参见教材P222—225)有,如斐波那契查找和插值查找等(参见教材P221—222)数学系计算数学教研室数据结构Ch02No.17四、分块查找(索引顺序查找)这是一种顺序查找的另一种改进方法。先让数据分块有序,即分成若干子表,要求每个子表中的数值(用关键字更准确)都比后一块中数值小(但子表内部未必有序)。然后将各子表中的最大关键字构成一个索引表,表中还要包含每个子表的起始地址(即头指针)。索引表最大关键字起始地址2212138920334244382448605874498653第1块第2块第3块224886例:2248861713特点:块间有序,块内无序数学系计算数学教研室数据结构Ch02No.18查找步骤分两步进行:①对索引表使用折半查找法(因为索引表是有序表);②确定了待查关键字所在的子表后,在子表内采用顺序查找法(因为各子表内部是无序表);查找效率:ASL=Lb+Lw对索引表查找的ASL对块内查找的ASL)21(log2)1(log22nASLnssnASLbsbsS为每块内部的记录个数,n/s即块的数目例如当n=9,s=3时,ASLbs=3.5,而折半法为3.1,顺序法为5数学系计算数学教研室数据结构Ch02No.19特点:一、二叉排序树的定义二、二叉排序树的插入与删除三、二叉排序树的查找分析四、平衡二叉树8.2动态查找表表结构在查找过程中动态生成。要求:对于给定值key,若表中存在其关键字等于key的记录,则查找成功返回;否则插入关键字等于key的记录。典型的动态表———二叉排序树数学系计算数学教研室数据结构Ch02No.20一、二叉排序树的定义(a)(b)练:下列2种图形中,哪个不是二叉排序树?----或是一棵空树;或者是具有如下性质的非空二叉树:(1)左子树的所有结点均小于根的值;(2)右子树的所有结点均大于根的值;(3)它的左右子树也分别为二叉排序树。讨论:对(a)中序遍历后的结果是什么?数学系计算数学教研室数据结构Ch02No.21二、二叉排序树的插入与删除将数据元素构造成二叉排序树的优点:①查找过程与顺序结构有序表中的折半查找相似,查找效率高;②中序遍历此二叉树,将会得到一个关键字的有序序列(即实现了排序运算);③如果查找不成功,能够方便地将被查元素插入到二叉树的叶子结点上,而且插入或删除时只需修改指针而不需移动元素。注:若数据元素的输入顺序不同,则得到的二叉排序树形态也不同!——这种既查找又插入的过程称为动态查找。二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态查找表的一种适宜表示。数学系计算数学教研室数据结构Ch02No.22452
本文标题:2015_12_SHI_DS_查找.
链接地址:https://www.777doc.com/doc-3017373 .html