资源简介 (共27张PPT)思考生活中的查找1、如何在一堆试卷中查找到自己的那一张试卷?2、如何从一本相册中查找到自己所需的那一张?3、如何在一车的旅客中查找到携带违禁品的旅客?CHZX5.4 数据查找浙江省高中信息技术 选择性必修一 《数据与数据结构》顺序查找算法思想程序实现01顺序查找Shunxu chazhao算法思想从第一个数据开始,按数据的顺序逐个将数据与给定的值进行比较。若某个数据与给定值相等,则查找成功,记录所查数据的位置;反之,则查找不成功。①算法简单,对数据是否有序没有要求。②查找效率较低,当数据量大时不宜使用。算法特点顺序查找Shunxu chazhao算法演算d[0] d[1] d[2] d[3] d[4] d[5]43 56 23 15 50 78在数组序列d=[43,56,23,15,50,78]中,查找关键字key为15的元素key=15①i=0,d[0]=43 !=key②i=1,d[1]=56 !=key③i=2,d[2]=23 !=key④i=3,d[3]=15 ==key→查找成功问题:若要查找的内容在n个数据中,则最理想情况是比较_______次?最差的情况需要比较________次?1n顺序查找Shunxu chazhao算法演算d[0] d[1] d[2] d[3] d[4] d[5]43 56 23 15 50 78在数组序列d=[43,56,23,15,50,78]中,查找关键字key为80的元素key=80①i=0,d[0]=43 !=key②i=1,d[1]=56 !=key……⑥i=5,d[5]=78 !=key问题:若要查找的内容不在n个数据中,则当i=________时,需反馈查找失败?nd[6]⑦i=6,查找失败顺序查找Shunxu chazhao程序实现For i in range(___________):If :________________else:__________________0,nd[i]==keyprint(i)print(“没找到”)①从0到n-1逐一比较②如果找到,输出下标③若找不到,提示失败问题:若找到元素,后续的比较是否还有必要进行?(假设就一个元素符合条件)break顺序查找Shunxu chazhao程序实现Flag=Falsefor i in range(0,n):if d[i]==key:flag=Turebreakif flag:print(i)else:print(“没找到”)找到/找不到,两种状态,利用一个逻辑型的变量flag来表示是否找到,没找到(False)继续找,找到了(True)就结束。练一练1、顺序查找算法的部分代码如下:Flag=Falsei=0while i<5 and Flag==False:i=i+1if a[i]==key :Flag=Trueif Flag==False :i=0数组元素a=[8,7,3,5,4],若key值为3,则运行该程序后,变量i的值是( )A.0 B.2 C.3 D.5B练一练2、某查找算法的VB代码如下:k=0i=0while i<=6:if a[i]==key :k=ii=i+1数组元素a=[5,3,5,1,8,5,9],当变量key值为5时,运用该算法处理后,变量k的值是( )A.1 B.2 C.5 D.0C练一练3.某查找算法的VB代码如下:k=0i=0while i<=6:if a[i]==key :k=ibreaki=i+1数组元素a=[5,3,5,1,8,5,9],当变量key值为5时,运用该算法处理后,变量k的值是( )A.1 B.2 C.5 D.0D思考现有1~100共100个数字,且这100个数字按顺序升序排列,待查找数key是这其中的一个,如何快速找到这个key?对分查找算法思想程序实现02对分查找Duifen chazhao算法思想首先将查找的数与有序数组内处于中间位置的数据比较,如果中间位置上的数与查找的数不同,则根据有序性,确定应该在数组的前半部分还是后半部分继续查找。在新确定的范围内,继续按上述方法,直到获得最终结果。①要求被查找数据必须有序。②查找效率非常高,适用于大数据查找。算法特点对分查找Duifen chazhao算法演算用数组d存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=48?d[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]d[8]d[9]←i←j←mid第1次查找:范围为__________,i=________,j=_____,mid=___________。d[mid]=__________。d[mid]_____key?∴后续查找的范围应该是_______________。d[0]~d[9]09(0+9)//2=4d[4]=22<d[5]~d[9]对分查找Duifen chazhao算法演算用数组d存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=48?d[5]d[6]d[7]d[8]d[9]←i←j←mid第2次查找:范围为_____________,i=________,j=_____,mid= ___________ 。d(mid)=______。d(mid)_____key?∴后续查找的范围应该是_______________。d[5]~d[9]95(5+9)//2=745<d[8]~d[9]d[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]d[8]d[9]←i←j←mid对分查找Duifen chazhao算法演算用数组d存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=48?d[5]d[6]d[7]d[8]d[9]←i←j←midd[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]d[8]d[9]←i←j←mid4852d[8]d[9]←i←j←mid第3次查找:范围为_____________,i=________,j=_____,mid=___________。d(mid)=______。d(mid)_____key?d[8]~d[9]89(8+9)//2=848=提示查找成功对分查找Duifen chazhao算法演算用数组d存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=48?d[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]d[8]d[9]第一次查找:d[0]~d[9],i=0,j=9,mid=4,d[mid]第二次查找:d[5]~d[9],i=5,j=9,mid=7,d[mid]第三次查找:d[8]~d[9],i=8,j=9,mid=8,d[mid]=key思考①若d[mid]②i和j是如何变化的?③若查找的值是52,最终i、j、mid的值为多少?后半i=mid+1,j不变i、j、mid相等对分查找Duifen chazhao算法演算用数组d存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=17?d[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]d[8]d[9]第一次查找:d(1)~d(10),i=1,j=10,mid=5,d(mid)>key第二次查找:d(1)~d(4),i=1,j=4,mid=2,d(mid)第三次查找:d(3)~d(4),i=3,j=4,mid=3,d(mid)=key思考①若d(mid)>key,则新查找的范围为______部分(前半/后半)②若d(mid)>key ,i和j是如何变化的?前半i不变,j=mid-1对分查找Duifen chazhao算法演算用数组d存放数组序列,用i表示查找范围的第一个数组元素下标,用j表示最后一个数组元素下标。假如查找键key=20?d[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]d[8]d[9]10151718d[0]d[1]d[2]d[3]←i←j←mid1718d[2]d[3]←i←j←mid18d[3]←i,j,mid思考继续进行查找的条件是什么?在什么情况下查找会结束?当i<=j时,重复查找。①找到数据,查找结束;②i>j时,找不到数据,查找结束。←i←j←mid对分查找Duifen chazhao算法演算数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]值 2 9 11 15 18 26 29 30 38 49查找次数3143234324对分查找的查找效率10个数进行对分查找算法,则平均查找次数: 次。对分查找最多查找次数: 次。2.9Log2n+1对分查找Duifen chazhao算法演算(1)key与d[mid]的大小比较影响i,j在后续查找中的取值。①若d[mid]②若d[mid]>key,则j=mid-1,i不变(2)继续重复进行查找的条件。当i<=j时(3)对分查找最多的查找次数(n个数据)。最多次数=Int(log2n)+1∵n个数据对分x次最后变为1个数据∴n*(1/2)^x=1∴x=log2n∵最后一个数据还要参与一次查找∴最多次数=Int(log2n)+1练一练1.用对分查找从数列3、6、7、10、12、16、25、30、75中查找数据10,则依次访问的数据为( )A. 12、6、7、10 B.12、7、10C.12、6、10 D.12、7、6、10A数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]值 3 6 7 10 12 16 25 30 75m1m2m3m4对分查找Duifen chazhao算法演算开始i=0,j=9d[mid]=key d[mid]查找成功查找失败结束YNYNYNmid=i<=j(i+j)//2i=mid+1j=mid-1对分查找Duifen chazhao程序实现key=int(input())d=[10,15,17,18,22,27,35,45,48,52]f=Falsei=0j=while :m=if d[m]==key:f=Truebreakif d[m]>key:else:if f==True:print("查找成功!下标为"+str(m))else:print("没有找到!")i<=j(i+j)//2j=m-1i=m+1①给i,j赋初值,②当i<=j时,重复执行查找工作③对分,取中值m④判断中值是否就是查找键⑤如果中值不是查找键,则判定下一个查找范围应该在前半部分还是在后半部分。注意i和j的控制。⑥输出查找结果len(d)-1练一练1. 某二分查找算法的程序如下:i=0j=7n=0while i<= j :n=n+1m=(i + j)//2if key==d[m]:breakelif key > d[m]:j=m-1else:i=m+1数组元素d[0]到d[7]的值依次为″83,75,62,41,33,27,16,2″,若运行该程序段后,n的值为2,则key的值可能是( )A.62或16 B.62或27 C.75或27 D.75或16C练一练 展开更多...... 收起↑ 资源预览