《数据结构》课件(C语言)第09章.ppt
《《数据结构》课件(C语言)第09章.ppt》由会员分享,可在线阅读,更多相关《《数据结构》课件(C语言)第09章.ppt(96页珍藏版)》请在三一办公上搜索。
1、数据结构,第九章 查找,第2页,第九章 查 找,内容和要求 查找的概念,顺序查找、二分法查找、分块查找的概念和方法,二叉排序树、平衡二叉树的查找,哈希表查找。要求获得有关静态和动态环境下几种基本的查找方法和技术知识。掌握顺序、二分法和分块查找的方法;了解哈希表是一种基本的存储结构、哈希表的背景和基本思路。掌握哈希表处理冲突的方法。重点 二分法查找方法;哈希表的动态查找。,第3页,查找表 由同一类型的数据元素(或记录)构成 的集合,基本概念,静态查找表 仅作查询与检索(统称为查找)工作的查找表。动态查找表 除作查询与检索之外,还需作诸如插入、删除之类更新操作的查找表。,查找 在一个含有众多数据元
2、素(或记录)的查找表中找出某个“特定的”数据元素(或记录)的过程。,关键字 能够标识一个数据元素(或记录)的某个数据项的值。当数据元素只有一个数据项时,其关键字即为该数据元素的值。主关键字 能唯一地标识一个记录的关键字。,给定一个值k,在含有n个记录(或数据元素)的表中找出关键字等于给定值k的记录,若找到,则查找成功,查找结果为给出整个记录的信息,或指示该记录在查找表中的位置;若找不到,则查找不成功,查找结果为NULL值或值0。,第4页,查找操作主要是关键字的比较,故通常把查找过程中对关键字需要执行的平均比较次数(亦称平均查找长度)作为衡量一个查找算法效率优劣的标准。,基本概念,平均查找长度
3、为了确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值(平均值)称为查找算法在查找成功时的平均查找长度(Average Search Length)。,对于含有n个记录的表,查找成功时的平均查找长度为(9-1)其中 Pi:表中第i个记录被查找的概率,有;Ci:找到表中其关键字与给定值相等的第i个记录时,所需要的比较次数。若无特别声明,均认为表中每个记录的概率均相等,即,第5页,约定和宏定义,宏定义#define EQ(a,b)(a)=(b)#define LT(a,b)(a)(b)#define LQ(a,b)(a)=(b)注:宏定义随不同的数据类型,有所不同。,第6页,1、静
4、态 查 找 表,静态查找表的ADT 静态查找表是一种最简单的查找表。Specification ADT Static_Search_Table Elements:查找表中的数据元素类型相同,每一数据元素 都存在一个能唯一标识该元素的关键字 Structure:查找表中的n个数据元素具有相同类型,属于 同一集合。数据元素之间不存在结构关系 Operation:Create(ST,n)生成操作:产生一个含用户给定的n个数据元素的表ST。Search(ST,K)查找函数:若表ST中存在其关键字等于给定值K的数据元素,则函数值为该元素在表中的位置;否则函数值为“空”。Traverse(ST)输出操作:
5、按某种次序输出表ST中所有数据元素。,第7页,顺序(线性)表的查找顺序查找,顺序(线性)表的查找是一种最简单的查找方法。它的算法基本思想是:,从表的一端开始,顺序地扫描线性表,依次将扫描到的关键字和给定值相比较,若当前扫描到的记录的关键字与给定值相等,则查找成功,找到所查记录;若直至扫描结束,仍未找到其关键字与给定值相等的记录,则查找不成功。,既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构。若使用单链表作存储结构时,扫描必须从第一个结点开始。若以向量作存储结构,则可从前往后或从后往前进行扫描。,第8页,顺序表的查找算法描述,typedef struct ElemType elem;
6、int Length;SSTable;,顺序(线性)表的查找,int seqsearch(SSTable st,keytype k)/*K为给定值,返回i为关键字等于K的记录在表st中的序号,i值为零表明查找不成功*/st.elem0.key=K;/设置监视哨 for(i=st.length;!EQ(st.elemi.key,key);i-)/从表尾开始向前扫描return i;/返回找到的位置/算法 9.1,第9页,算法性能分析,若查找每个记录时是等概率,则有 ASLss=(n+1)/2,顺序(线性)表的查找,(9-2),第10页,如果考虑到不成功的查找,则查找算法的平均查找长度应是查找成功
7、时的平均长度与查找不成功时的平均查找长度之和。若假设查找成功与不成功的可能性相同,对每个记录的查找概率也相等,即。由于查找不成功的比较次数总是n+1,故顺序查找的平均查找长度为,顺序(线性)表的查找,第11页,(2)当表中各个记录的查找概率互不相等时,为了提高查找效率,宜将诸记录先按查找概率由小到大进行排列(式(9-2)在P1P2Pn-1Pn时达到极小值);,说明:(1)顺序查找算法简单,且对表的结构无任何要求(无论按向量还是链表结构,无论记录间是否按关键字有序排列),故此算法适应面广。但当n1时,查找效率随n越大而越低。,顺序(线性)表的查找,(3)在很多实际应用的情况下,各记录的查找概率无
8、法事先确定,则可以采用“自组织”形式的顺序查找表。,第12页,有序表的查找折半查找,折半查找又称二分查找(Binary Search),它是一种效率高的查找方法。折半查找的前提是静态查找表是有序表,即表中记录按关键字有序排列,且需使用向量作为表的存储结构。不妨设有序表是递增有序的。,折半查找的算法思想:先确定待查记录所在的范围(区间),然后以处于区间中间位置记录的关键字和给定值K相比较,(1)若相等,则查找成功;(2)若不等,则缩小范围,继续按此法查找,直至新的区间位置记录的关键字等于给定值K,或者查找区间的大小等于零(表明查找不成功)时为止。,猜数游戏的方法,第13页,有序表的折半算法描述,
9、int Search_Bin(SSTable st,KeyType key)/在有序表st中折半查找关健字等于给定值key的记录 int mid;low=1;hig=st.Length;/置区间初值 while(low hig)/判别查找区间大小 mid=(low+hig)/2;switch case K st.elemmid.key:low=mid+1;case K=st.elemmid.key:return mid;case K st.elemmid.key:hig=mid-1;return(0);/查找不成功/算法 9.2,有序表的查找折半查找,第14页,算法性能分析,这棵二叉树并非完全
10、二叉树,但其叶结点所在层次之差至多为1。因此,该二叉树深度与一根完全二叉树相同,为。这里n是二叉树结点的个数,亦即有序表中数据元素的个数。,折半查找过程中可用二叉树来描述(判定树)。树根为表的中间记录。根的左子树关键字均小于根的关键字,根的右子树关键字均大于根的关键字。,有序表的查找折半查找,第15页,结论:折半查找法在查找成功时进行比较的关键字个数最多不超过树的深度,即 问题:查找不成功的情况如何?,示例2 对于如示例1所给数据,描述折半查找过程加上外部结点的判定树和查找关健字为85的结点,示意如下,结论:折半查找在查找不成功时和给定值进行比较的关健字个数最多不超过,有序表的查找折半查找,第
11、16页,折半查找的平均查找长度的计算:记 h=log2(n+1),即有 n=2h-1,则描述折半查找的判定树是深度为h的满二叉树。设表中每个记录的查找概率均相等(Pi=1/n),则查找成功时折半查找的平均查找长度,其中j为层数,2j-1为该层结点数。,记,则,故有,因为,当n1时,有,有序表的查找折半查找,第17页,说明:折半查找的效率比顺序查找高。,有序表的查找折半查找,而排序本身是一种很费时的操作,即使采用高效率的排序方法也要花费 O(nlog2n)的时间代价。,另外,折半查找仅适用于顺序存储结构,为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。故折半查找特别适用于那些一经建
12、立就很少改动,而又经常需要查找的线性表,而对那此查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找;,第18页,索引顺序表的查找分块查找,以索引顺序表表示静态查找表时,可采用分块查找(Blocking Search)方法来进行查找。分块查找又称索引顺序查找,它是一种性能介于顺序查找和折半查找之间的方法。,分块查找法要求按如下的索引方式来存储一个线性表:将表 R1.n 均分为b块,前b-1块中结点个数为,第b块的结点数小于或等于S。每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即要求表是“分块有序”的。抽取各块中的最大关键字及起始位置,构成一个索
13、引表 ID1.b。由于表R是分块有序的,所以索引表应是一个递增有序表。,第19页,示例3 分块有序表的索引存储表示,分块查找的算法思想:(1)查找索引表,确定待查关键字所在的块(子表)。由于索引表是按记录关健字有序,故宜采用折半查找法;(2)在所确定的块中查找是否存在关键字与给定值相同的记录。此时需采用顺序查找法。故分块查找的算法实际上是折半查找算法和顺序查找算法的简单合成。,索引顺序表的查找分块查找,图9.6 表及其索引表,第20页,分块查找的算法分析 分块查找实际上是两次查找过程,故整个算法的平均查找长度是两次查找的平均查找长度之和,即 ASLbs=Lb+Lw,其中 Lb:查找索引表所在子
14、表的平均查找长度 Lw:在子表中顺序查找记录的平均查找长度 设将表均匀分布成b个子表,每个子表包含s个记录(最后一个子表可能不足s个记录),并设表中每个记录的查找概率均相等,即每个子表的查找概率为1/b,子表中每个记录的查找概率为1/s。,(1)若用顺序查找确定所在块,则,索引顺序表的查找分块查找,与表长n有关,与块中记录个数s有关,第21页,(2)若用折半查找法确定所在块,则,示例4 若表中有n=10000个记录,取 即将该表分成100块,每块中含100个记录。则用顺序查找确定块的分块查找平均需要做101次比较,而若用折半查找确定所在块,则最多需做约57次比较。若使用顺序查找,平均需做约50
15、00次比较,而使用折半查找,则最多需做约14次比较。故分块查找算法的效率介于顺序查找和折半查找算法之间。,索引顺序表的查找分块查找,第22页,说明:(1)分块查找的优点是,在表中插入或删除一个记录时,只要找到该记录应当所属的块,然后在块内进行插入和删除运算。因为块内记录的存放是任意的,所以插入或删除比较容易,不需要移动大量记录。分块查找的主要代价是增加一个辅助数组的存储空间和将初始表分块排序的操作;,索引顺序表的查找分块查找,(2)在实用中,分块查找不一定要将线性表分成大小相等的若干块,而应该根据表的特征进行分块。例如,一个学校的学生登记表,可按系号或班号分块。此外,各块中的记录也不一定要存放
16、在同一个向量中,可将各块放在不同的向量中,也可将每一块存放在同一个单链表中。,第23页,动 态 查 找 表,当用线性表作为表的组织形式时,可采用顺序查找、折半查找、分块查找等查找方法,其中以折半查找效率最高。但折半查找要求表中结点按关健字有序,且不能使用链表作存储结构。因此,当表的插入或删除操作频繁时,为了维护表的有序性,势必要移动表中很多结点,引起额外的时间开销,从而抵消了折半查找的优点。希望采用既具有如折半查找那样的查找效率、又易于进行诸如插入、删除结点操作的表的组织方式。这就是动态查找表。,动态查找表的ADT,第24页,动态查找表既具有顺序表那样较高的检索效率,又具有链表那样插入、删除的
17、灵活性。它可有不同的表示方法,但较典型的是采用特殊的树或二叉树作为动态查找表的一种组织方式,可统称为树表。,动态查找表的特点:表结构本身是在查找过程中动态生成的,即对于给定值K,若表中存在其关健字等于K的结点(记录),则查找成功返回,否则插入关健字等于K的结点(记录)。在动态查找表中亦允许删除表中结点。,动 态 查 找 表,动态查找表的ADT,第25页,Specification ADT Dynamic_Search_TableElements:表中各结点都含有一个类型相同的关健字,并且 该关健字可唯一地识别结点Structure:n个结点具有查同属性,同属一个集合,动态查找表的ADT,Ope
18、ration:Initialize(DT)初始化操作:设置一个空的动态查找表DT。Search(DT,K)查找函数:若表DT中存在其关键字等于给定值K的结点,则函数值为该结点或它在表中的位置;否则函数值为“空”。Insert(DT,K)插入操作:若表DT中存在其关键字等于给定值K的结点,则空操作;否则插入其关键字等于K的结点。Delete(DT,K)删除操作:若表中存在其关键字等于给定值K的结点,则删除之;否则空操作。Traverse(DT)输出操作 按某种次序输出表DT中所有结点。,第26页,二叉排序树及其查找过程,二叉排序树(Binary Sort Tree)又称为二叉查找树或二叉搜索树(
19、Binary Search Tree)。它是一种特殊结构的二叉树。,动 态 查 找 表,定义:二叉排序树或者是一棵空树,或者是具有如下性质的二叉树:(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左、右子树也分别为二叉排序树。显见。关于二叉树排序树的这一定义是递归的。,第27页,示例1 如下是两棵二叉排序树,(a)图9.7 二叉排序树示例(b),二叉排序树的一个重要性质:性质 对二叉排序树按中序遍历该树所得到的中序序列是一个递增有序序列。故一个无序序列可以通过构造一棵二叉排序树而变成一个有序序列,
20、构造树的过程即为对无序序列进行排序的过程。,二叉排序树及其查找过程,第28页,二叉排序树的查找算法描述,BiTree bstsrch(BiTree t,KeyType K)/在指针t所指的二叉排序树上查找其关健字等于给定值K的记录,当查找成功时,返回指向该记录结点的指针,否则返回空指针 if(t=NULL)|(t-data.key=K)return t;else if(t-data.key rchild,k);else return bstsrch(t-lchild,k);/算 法 9.4(a),第29页,二叉排序树的插入和生成,二叉排序树是一种动态树表。其特点是,树的结构通常不是一次生成的,
21、而是在查找过程中,当树中不存在关键字等于给定值的结点时再进行插入。,动 态 查 找 表,在二叉排序树中插入新结点,需保证插入后仍符合二叉排序树的定义。,在二叉排序树中插入新结点,需保证插入后仍符合二叉排序树的定义。插入的前提:查找不成功 插入的位置:若二叉排序树为空,则插入结点成为新的根结点;否则,沿左子树或右子树继续查找,直至某结点的左子树或右子树为空为止,插入结点作为一个新的叶结点并成为该结点的左孩子或右孩子结点。,第30页,二叉排序树查找算法的修正算法,Status SearchBST(BiTree t,KeyType K,BiTree f,BiTree,else if(Kdata.ke
22、y)/继续在左子树上进行查找 SearchBST(t-lchild,key,t,p)else/继续在右子树上进行查找 SearchBST(t-rchild,key,t,p)/算 法 9.4(b),参数f的作用?,第31页,二叉排序树的插入算法,Status ins_bstree(BiTree/算 法 9.5,第32页,从二叉排序树的生成过程可以看到,它经历了若干次插入新结点的操作。每次插入的新结点都是二叉排序树上新的叶子结点,则在进行插入操作时,不必移动其它结点,仅需改动某个结点的指针,由空变为非空即可。它表明,二叉排序树既有类似于折半查找的特性,又采用了链表作存储结构,因此是动态查找表的一种
23、适宜表示。,示例2 设从空树出发,对于输入关键字序列45,24,53,12,37,93,经过一序列的查找、插入操作,可陆续生成一棵二叉排序树:,45,24,53,12,37,93,图9.8 二叉排序树的构造过程,二叉排序树的插入,初始,问题:如何实现在一个二叉排序树上删除某个结点?,第33页,二叉排序树的删除,从二叉排序树上删除一个结点,不能把以该结点为根的子树都删去,而只能删掉该结点自身,并且还要保证删除后所得的二叉树仍然满足二叉排序树的性质。也就是说,在二叉排序树中删去一个结点,相当于删去有序序列中的一个结点。删除操作必须进行查找,以确定被删结点是否在二叉排序树中。若不在,则不做任何事情;
24、若在,则设法删除之。,动 态 查 找 表,第34页,(3)p结点既有左子树又有右子树,即p结点的左、右子树均不空。此时不能作简单处理,而需对p结点的左、右子树进行细化,目的是将p的左、右子树链接到合适的位置,并保持二叉排序树的特性。,假设在二叉排序树上被删结点为 p,其双亲结点为 f,且不失一般性,可设 p 是 f 的左指针,(2)p结点只有左子树pL或右子树pR,则令pL或pR直接成为 f结点的左子树即可;,二叉排序树的删除,分三种情况进行讨论删除操作,第35页,设删除结点 p之前二叉排序树的形状如下(细化PL),按中序遍历所得序列为 CLCQLQSLSPPRF,若欲删去结点 p,且保持二叉
25、排序树的特性,则所指指针改变而获得的新二叉树排序树,经按中序遍历所得序列应为 CLCQLQSLSPRF,P,C,CL,PR,p,c,F,f,Q,S,QL,SL,q,s,可采用两种做法实现之,做法一 令 p的左子树为 f的左子树,而 p的右子树为 s的右子树,做法二 令 p的直接前驱(或者接后继)替代 p,然后再从二叉排序树中删去它的直接前驱(或直接后继),二叉排序树的删除,第36页,做法一 令 p 的左子树为 f 的左子树,而 p 的右子树为 s 的右子树,f-lchild=p-lchild;s-rchild=p-rchild;,P,C,CL,PR,p,c,F,f,Q,S,QL,SL,q,s,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件 语言 09

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