数据结构课件查找

上传人:痛*** 文档编号:241404450 上传时间:2024-06-23 格式:PPT 页数:93 大小:728.50KB
返回 下载 相关 举报
数据结构课件查找_第1页
第1页 / 共93页
数据结构课件查找_第2页
第2页 / 共93页
数据结构课件查找_第3页
第3页 / 共93页
点击查看更多>>
资源描述
第九章 查找 由于由于查查找运算的使用效率很高,几乎在任意一个找运算的使用效率很高,几乎在任意一个计计算算机系机系统软统软件和件和应应用用软软件中都会涉及到,所以当件中都会涉及到,所以当问题问题所涉及所涉及的数据量相当大的数据量相当大时时,查查找方法的效率就找方法的效率就显显得格外重要。得格外重要。在一些在一些实实事事查询查询系系统统中尤其如此。因此,本章将系中尤其如此。因此,本章将系统统地地讨论讨论各种各种查查找方法,并通找方法,并通过对过对它它们们的效率分析来比的效率分析来比较较各各种种查查找方法的找方法的优优劣。劣。6/23/20241第九章 查找9.1静态查找表9.2动态查找表9.3哈希表6/23/20242查找的基本概念查找又称为查询或检索,是在一批记录中依照某个域的指定域值,找出相应的记录的操作。在计算机中,被查找的数据对象是由同一类型的记录构成的集合,可称之为查找表(search table)。在实际应用问题中,每个记录一般包含有多个数据域,查找是根据其中某一个指定的域进行的,这个作为查找依据的域称为关键字(key)。6/23/20243对于给定的关键字的值,如果在表中经过查找能找到相应的记录,则称查找成功,一般可输出该记录的有关信息或指示该记录在查找表中的位置。若表中不存在相应的记录,则称查找不成功,此时应该给出不成功的信息。查找算法中的基本运算是记录的关键字与给定值所进行的比较,其执行时间通常取决于比较的次数。因此,通常以关键字与给定值进行比较的记录个数的平均值,作为衡量查找算法好坏的依据。6/23/20244查找表操作及分类操作:(1)查询某个“特定的”数据元素是否在查找表中;(2)某个“特定的”数据元素的各种属性;(3)在查找表中插入一个数据元素;(4)从查找表中删去某个数据元素。分类:若对查找表只作(1)和(2)两种操作,则称此类查找表为静态查找表。若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,则称此类查找表为动态查找表。6/23/202459.1 静态查找表抽象数据类型静态查找表的定义:ADTStaticSearchTable数据对象D:D是具有相同属性的数据元素的集合。数据关系R:数据元素同属一个集合。基本操作P:Create(&ST,n);Destroy(&ST);Search(ST,key);Traverse(ST,Visit();ADTStaticSearchTable6/23/20246 一、顺序查找顺顺顺顺序序序序查查查查找的基本思想是:找的基本思想是:找的基本思想是:找的基本思想是:从线性表的一端开始,依次将扫描到得结点关键字和给定值K相比较。若当前扫描到得结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。顺顺顺顺序序序序查查查查找的存找的存找的存找的存储结储结储结储结构要求:构要求:构要求:构要求:顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构(使用单链表作为存储结构时,扫描必须从第一个结点开始),顺序查找对数据在表中存放的先后次序没有任何要求。在表的组织方式中,线性表是最简单的一种。顺序查找是一种最简单的查找方式。6/23/20247顺序查找的线性表定义如下:typedefstructElemType*elem;intlength;每个每个结结点包含两部分点包含两部分内容:内容:Key 和和info其他其他信息信息6/23/20248(2)算法的算法的实现实现:技巧:技巧:把待把待查查关关键键字字keykey存入表存入表头头或表尾(俗称或表尾(俗称“哨兵哨兵”),),这样这样可以加快可以加快执执行速度。行速度。例:例:若将待若将待查查找的特定找的特定值值keykey存入存入顺顺序表的序表的首部首部(如(如0 0号号单单元)元),则顺则顺序序查查找的找的实现实现方案方案为为:从后向前从后向前逐个比逐个比较较!int Search_Seq(SSTable ST,KeyType key)/在在顺顺序表序表STST中,中,查查找关找关键键字与字与keykey相同的元素;若成功,返回其位相同的元素;若成功,返回其位置信息,否置信息,否则则返回返回0 0 ST.elem0.key=key;/设设立哨兵,可免去立哨兵,可免去查查找找过过程中每一步程中每一步都要都要检测检测是否是否查查找完找完毕毕,0单单元被当作元被当作监视监视哨,用来判断表是否哨,用来判断表是否查查找完找完毕毕(技巧)(技巧)。当。当n1000n1000时时,查查找找时间时间将减少一半。将减少一半。for(i=ST.length;ST.elem i.key!=key;-i );/不要用不要用for(i=n;i0;-i)for(i=n;i0;-i)或或 for(i=1;i=n;i+)for(i=1;i0;-i)if(ST.elem i.key=key)return i;使使用用了了监监视视哨哨,在在查查找找过过程程中中,不不用用每每一一步步都都去去判判断断是是否否查查找找结结束束。0单单元元被被当当作作监监视视哨哨,用用来来判判断断表表是是否否查查找找完完毕毕(技技巧巧)。当当n1000n1000时时,查查找找时时间间将减少一半。将减少一半。找找到到:返返回回元元素素在在线线性表中的存性表中的存储储位置;位置;未找到:返回未找到:返回0。6/23/202410 查查找效率怎找效率怎样计样计算?算?用平均用平均查查找找长长度度ASL衡量。衡量。讨论讨论平均平均查查找找长长度:度:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度(Average Search Length)。6/23/202411平均平均查查找找长长度度(ASLASL:average search lengthaverage search length)。)。其中:其中:n是文件是文件记录记录个数;个数;P Pi i是是查查找第找第i i个个记录记录的的查查找概率(通常取等概率找概率(通常取等概率,即即P Pi i=1/n=1/n);C Ci i是找到第是找到第i i个个记录时记录时所所经历经历的比的比较较次数。次数。统计统计意意义义上的上的数学期望数学期望值值物理意物理意义义:假假设设每一元素被每一元素被查查找的概率相同,找的概率相同,则查则查找每找每一元素所需的比一元素所需的比较较次数之次数之总总和再取平均,即和再取平均,即为为ASLASL。显显然,然,ASLASL值值越小,越小,时间时间效率越高。效率越高。6/23/202412讨论讨论如何如何计计算算ASL?分析:分析:查查找第找第1个元素所需的比个元素所需的比较较次数次数为为1;查查找第找第2个元素所需的比个元素所需的比较较次数次数为为2;查查找第找第n个元素所需的比个元素所需的比较较次数次数为为n;总计总计全部比全部比较较次数次数为为:12n=(1+n)n/2未考未考虑查虑查找不成功的找不成功的情况:情况:查查找哨兵所需找哨兵所需的比的比较较次数次数为为n+1n+1这这是是查查找成功的情况找成功的情况若求某一个元素的平均若求某一个元素的平均查查找次数,找次数,还应还应当除以当除以n(等概率),(等概率),即:即:ASL(1n)/2 ,时间时间效率效率为为 O(n)6/23/202413u如果查找不成功的情况不能忽略时:ASL的计算步骤:查找成功的概率为1/2;那么查找成功时第i个记录的概率pi=1/2n,所以查找成功时的ASL=(ni+1)=(n+1)ni=112n4112_查找不成功的概率为1/2;所以查找不成功时的ASL=(n+1)所以所以所以所以:ASLss=3/4(n+1)6/23/202414顺序查找算法分析顺序查找的优点是算法简单、适应面广,且不要求表中数据有序。缺点是平均查找长度较大,特别是当n较大时,查找效率较低,不宜采用。6/23/202415二、有序表的查找(折半查找)折半查找(Birary search)也称为二分查找,它的查找速度比顺序查找快,但它要求数据在数据在数据在数据在线线线线性表中性表中性表中性表中按按按按查查查查找的关找的关找的关找的关键键键键字域有序排列。字域有序排列。字域有序排列。字域有序排列。设n个数据存放于数组r中,且已经过排序,按由小到大递增的顺序排列。采用二分查找,首先用要查找的给定值k与表正中间元素的关键值相比较,此元素的下标:6/23/202416比较结果有三种可能:如果rm.keyk,说明如果存在欲查找的元素,该元素一定在数组的前半部分,查找范围缩小了一半,修改查找范围的的上界high=m-1,继续对数组的前半部分进行二分查找;如果rm.keyk,说明如果存在欲查找的元素,该元素一定在数组的后半部分,查找范围缩小了一半,修改查找范围的的下界low=m+1,继续对数组的后半部分进行二分查找;如果rm.key=k,查找成功,m所指的记录就是查找到的数据。6/23/202417重复上述过程,查找范围每次缩小1/2,当范围不断缩小,出现查找范围的下界大于上界时,则查找失败,确定关键字为key的记录不存在。二分查找是一种效率较高的算法,最好的情况是第一次比较即找到所查元素,即使一次比较没有找到,也把进一步查找的范围缩小一半。与此类似,每比较一次均使查找范围减半,故最坏的情况所需比较次数为O(log2n),对于较大的n显然较顺序查找速度快得多。6/23/202418查查找找23和和79的的过过程如下程如下图图:mid=(low+high)/2不不进进位取整位取整(08,14,23,37,46,55,68,79,91)(08,14,23,37,46,55,68,79,91)lowhighmid(08,14,23,37,46,55,68,79,91)lowhigh=mid-1mid(08,14,23,37,46,55,68,79,91)low=mid+1highmid(08,14,23,37,46,55,68,79,91)lowhighmid(08,14,23,37,46,55,68,79,91)lowhighmid(08,14,23,37,46,55,68,79,91)lowhighmid6/23/202419折半折半查查找的找的c语语言算法程序:言算法程序:int Search_Bin(SSTable ST,int n,int key)int low,high,mid;low=1;high=n;while(low=high)mid=(low+high)/2;if(STmid.key=key)return(mid);/*查查找成功找成功*/else if(key50n50n50n50时时时时,可得近似,可得近似,可得近似,可得近似结结结结果果果果ASLbs2(n+1)16/23/202422二分查找的性能分析具体例子(11个元素)查找过程可用判定树 描述查找成功时进行比较的 关键字个数最多不超过 树的深度log2n+1 当n较大时,平均查找长度为 ASLbs=log2(n+1)163194710258116/23/202423三、静态树表的查找u 当有序表中各记录的查找概率相等时,按照判定树描述的查找过程来进行折半查找,性能最优;有序表中各记录的查找概率不等时,二分查找性能不一定最优。u 可由具体例子说明。u 静态最优查找树和次优查找树方法可解决这一问题。6/23/202424例如例如关键字:ABCDEci:23123此时:ASL=20.2+30.3+10.05+20.3+30.15=2.4若改变ci的值:21323则:ASL=20.2+10.3+30.05+20.3+30.15=1.9不是中不是中不是中不是中间间间间的比,而是根据概率的比,而是根据概率的比,而是根据概率的比,而是根据概率值值值值得不同具体得不同具体得不同具体得不同具体选择选择选择选择。CADB12345pi:0.20.30.050.30.15E6/23/202425在概率不等的情况下:在概率不等的情况下:在概率不等的情况下:在概率不等的情况下:如何能如何能如何能如何能够够够够使平均使平均使平均使平均查查查查找找找找长长长长度最小?度最小?度最小?度最小?查查找概率大的找概率大的查查找路径要短找路径要短判定判定判定判定树该树该树该树该如何如何如何如何设计设计设计设计PH=wihini=1其中,wi=cpi,c为常量,pi为结点i的查找概率,hi为结点所在的层次,称PH值最小的判定二叉树为静态最优查找树。(这里只考虑查找成功的情况)如果只考虑查找成功的情况,则使查找性能达到最佳的判定树是其带全路径长度之和PH值取最小的二叉树6/23/202426 构建静构建静构建静构建静态态态态最最最最优查优查优查优查找找找找树树树树的代价很高,的代价很高,的代价很高,的代价很高,这这这这里介里介里介里介绍绍绍绍一种一种一种一种构造近似最有构造近似最有构造近似最有构造近似最有树树树树的算法的算法的算法的算法 次次次次优查优查优查优查找找找找树树树树。二、次二、次二、次二、次优查优查优查优查找找找找树树树树的构造的构造的构造的构造已知一个序列:(rl,rl+1,,rh),递增有序其中:rl.keyrl+1.keydata=k)return(b);6/23/202438二叉排序树查找递归算法if(kdata)return(search(bleft,k);elsereturn(search(bright,k);6/23/202439非递归算法btree*treesearch(btree*b,intk)btree*p;p=b;while(p!=NULL);if(pdata=k)return(p);elseif(kdata)p=pleft;elsep=pright;return(NULL);6/23/202440二叉排序树的插入二叉排序树是一种动态树表。特点是树的结构不是一次生成,而是在查找过程中,当树中不存在关键字等于给定值的结点时再进行插入。新插入的结点一定是一个新添加的叶子结点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。6/23/202441二叉排序树的插入(续)从空树出发,经过一系列的查找插入操作之后,可生成一棵二叉排序树。设查找的关键字序列为45,12,53,3,37,50,98,1,8,43,60,则生成的二叉排序树如下中序遍历二叉排序树可得到一个关键字的有序序列。插入时,不必移动结点。45123533750988431606/23/202442二叉排序树的删除一般二叉树删除存在的问题。如何在二叉排序树上删除结点?设在二叉排序树上被删结点为*p,其双亲结点为*f,又*p是*f的左孩子。若*p为叶子结点,其左右子树为空。此时只需修改*f的指针。若*p只有左子树PL或只有右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树即可。6/23/202443二叉排序树的删除(续)若*p的左子树PL和右子树PR均不空。根据图示可知,在删去*p之前,中序遍历该二叉树得到的序列为CLCQLQSLSPPRF,在删去*p之后,仍应保持其它元素的相对位置不变,方法一是令*p的左子树为*f的左子树,而*p的右子树为*s的右子树;方法二是令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。6/23/202444二叉排序树的删除图示FPfpPLPRFPfpCLPRfCQSQLSLFCfcCLPRfQSQLSLc6/23/202445在二叉排序树上进行查找,若查找成功,则是从根结点出发走了一条从根结点到所查找结点的路径;若查找不成功,则是从根结点出发走了一条从根结点到某个终端叶子结点的路径。与二分查找类似,和关键字比较的次数不超过二叉排序树的深度。但是,含有n个结点的二叉树不是唯一的,由于对其结点插入的先后次序不同,所构成的二叉树的形态和深度也可能不同。例如,下页图是按不同插入次序得到的两个二叉排序树。二叉排序树查找分析6/23/202446两个二叉排序树在查找失败的情况下,在这二个树上所进行的关键字比较次数分别为3和6次。6/23/202447二叉排序树查找分析(续)树型查找最坏情况时,需要的查找时间取决于树的高度,当二叉排序树接近满二叉树时,其高度为log2n,最坏情况下查找时间为O(logn),与二分查找是同样数量级的;当二叉排序树为只有一个端结点的所谓“退化树”时,其高度等于n,最坏情况下查找时间为O(n),与顺序查找属于同一数量级。为了保证树型查找有较高的查找速度,我们希望该二叉树接近满二叉树,也就是希望二叉树的每一个结点的左、右子树高度尽量接近平衡,即使按任意次序不断地插入结点,也不要使此树成为退化树。6/23/202448平衡树平衡树(Balancedtree)也称为AVL树,是由阿德尔森维尔斯基和兰迪斯(Adelsonvelskiiandlandis)于1962年首先提出的。这是一种附加了一定限制条件的二叉树。我们定义二叉树中每一结点的左子树高度减右子树高度为该结点的平衡因子(Balancefactor),所谓平衡树,是指一个二叉树其任一结点的平衡因子值只能是+1,0或1,即任一结点的左、右子树高度之差不超过1。如下页图所示,图中数字为该结点的平衡因子。6/23/202449平衡树平衡二叉树不平衡二叉不平衡二叉树树 6/23/202450假设给平衡树某个结点的左子树插入一个新结点,且此新结点使左子树的高度加1,我们可能会遇到以下三种情况:(1)如果原来其左子树高度hl与右子树高度hr相等,即原来此结点的平衡因子等于0,插入新结点后将使平衡因子变成+1,但仍符合平衡树的条件,不必对其加以调整;如果原来hlhr,即原来此结点的平衡因子等于+1,插入新结点后将使平衡因子变成+2,破坏了平衡树的限制条件,需对其加以调整;如果原来hlhr,即原来此结点的平衡因子等于1,插入新结点后将使平衡因子变成0,平衡更加改善,不必加以调整。6/23/202451如果给平衡树某结点的右子树插入一个结点,且设此新结点使右子树的高度增加1,则也会遇到与之相对应的三种情况。以下页图所示的树为例,设原已有关键字为51,29,72,11和46这五个结点,原树符合平衡树条件,图中各结点旁所标数字为该结点的平衡因子。6/23/202452平衡树插入结点6/23/202453插入新结点破坏了平衡树条件的情况分为两类,仍以向左子树插入新结点为例,这两类情况分别如下页图(a)和(c)所示。图中矩形表示子树,矩形的高度表示子树的高度,带阴影线的方形则表示插入新结点后造成的子树高度加1,各结点旁所标数字为该结点的平衡因子。6/23/202454平衡树的调整图6/23/2024556/23/202456平衡树以二叉链表作为存储结构,每个结点还要增加一个平衡因子域。平衡树的查找运算与普通树型查找完全相同,由于平衡树附加了平衡条件,其高度与结点数相同的完全树属于同一数量级,所以有较快的查找速度。在插入新结点时,当确定了新结点应插入的位置后,需向回寻找有关平衡因子变为+2或-2的祖先,如有这种结点,则取其中层数居最低者,根据不同的情况进行单旋转或双旋转,使整个树仍然符合平衡树的条件,每次插入结点后,还需对有关祖先的平衡因子加以修改。6/23/202457B-树前面介绍的查找方法,均适用于查找存储在内存中的数据,统称为内查找方法,它们适用于较小的表,而对较大的、存储在外存储器上的文件就不合适了。B-树是一种多路平衡查找树,这是一种适用于外查找的方法的数据结构。B树的定义:一棵m(m3)阶的B-树,或者为空树,或者是满足如下条件的m叉树:6/23/202458(1)树中每个非终端结点至少包含以下数据项:(n,A0,K1,A1,K2,Kn,An)其中,n为关键字总数,Ki(1in)是关键字,Ai是指向子树根结点的指针。关键字是递增有序的:K1K20)if(i=m)i=1;elsei+;/*i未到达表末端则后移一个单元进行线性探测,否则返回到表首端继续探测,直至找到待查关键字k或者遇到开放地址为止*/6/23/202481查找算法续if(Ai=0)Ai=k;return(i);6/23/202482例1设有一组关键字19,01,23,14,55,20,84,27,68,11,10,77,采用哈希函数:H(k)=kmod13。采用开放地址的线性探测法解决冲突,试在018的散列地址空间中,对该关键字序列构造散列表。解:依题意m=19,得到线性探测法对应的探查地址序列计算公式为:di=(H(k)+j)mod19;j=1,2,18其计算函数如下:H(19)=19mod13=6H(01)=01mod13=16/23/202483H(23)=23mod13=10H(14)=14mod13=1(冲突)H(14)=(1+1)mod19=2H(55)=55mod13=3H(20)=20mod13=7H(84)=84mod13=6(冲突)H(84)=(6+1)mod19=7(冲突)H(84)=(6+2)mod19=8H(27)=27mod13=1(冲突)H(27)=(1+1)mod19=2(冲突)6/23/202484H(27)=(1+2)mod19=3(冲突)H(27)=(1+3)mod19=4H(68)=68mod13=3(冲突)H(68)=(3+1)mod19=4(冲突)H(68)=(3+2)mod19=5H(11)=11mod13=11H(10)=10mod13=10(冲突)H(10)=(10+1)mod19=11(冲突)H(10)=(10+2)mod19=12H(77)=77mod13=12(冲突)H(77)=(12+1)mod19=136/23/202485例地址分配6/23/202486查找效率分析哈希表的查找效率仍以平均查找长度量度。其中平均查找长度为每个元素的查找长度之和除以所有元素的个数。比较次数取决于下列三个因素:哈希函数、处理冲突的方法和哈希表的装填因子。哈希表的装填因子定义为=表中填入的记录数/哈希表的长度最好在0.60.9之间。6/23/202487查找效率分析(续)线性探测再散列的哈希表查找成功时的平均查找长度为Snl(1+1/(1)/2随机探测再散列、二次探测再散列和再哈希的哈希表查找成功时的平均查找长度为Snrln(1)/链地址法处理冲突的哈希表查找成功时的平均查找长度为Snc1+/2哈希表在查找不成功时的讨论略6/23/202488查找的应用实例“口令”或“密码”的查找计算机病毒的检测技术在“电信通话记录”中的查找6/23/202489第九章 小结查找顺序查找二分查找分块查找树型查找平衡树散列法处理冲突的方法开放地址法链地址法6/23/202490练习题1若对大小为n的有序的顺序表和无序的顺序表分别进行顺序查找,试在下列二种情况下分别讨论在等概率时的平均查找长度是否相同?(1)查找不成功;(2)查找成功。2画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度。6/23/202491练习题3已知如下所示长度为12的表(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct,Nov,Dec)(1)试按表中元素顺序依次插入一棵初始为空的二叉排序树,请画出插入完成后的二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。(2)若对表中元素先进行排序构成有序表,求在等概率的情况下对此表进行折半查找时查找成功时的平均查找长度。(3)按表中元素顺序构造一棵平衡二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。6/23/202492练习题4.设关键字集合为27,49,79,5,37,1,56,65,83,散列函数为:H(k)=kmod7,散列表长度m=10,起始地址为0,分别用线性探测和链地址法来解决冲突。试画出对应的散列表。6/23/202493
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!