资源简介 (共22张PPT)5.4 数 据 查 找——查找算法的应用册 别:选择性必修1学 科:高中信息技术(浙教版)学习目标:能对给定的文件中的数据进行抽象并建立模型。能合理选用数据结构,设计查找算法。能用Python语言编写具体的查找程序。能自觉对学习生活具体问题抽象建模、设计算法并编写程序及调试程序。阅读教材P141-144,可根据个性学习暂停或加速播放课程。查找应用:想一想:航空公司VIP会员积分查询部分数据(Excel数据)VIP号 姓名 飞行里程(KM) 积分600214 韩江辉 16801 519601278 蒋志来 5321 78600815 李亚东 28745 436607854 王庆生 1861 39605719 李燕 7493 138603532 王晓燕 6875 102600101 郑煜明 14253 236600087 蔡佳宁 112703 958(一)抽象与建模问题:从表中的数据可以看出,每个会员的信息是一条记录,包括VIP号、姓名、飞行里程、积分等数据项。实践体验:Excel表格中,对记录快速查询会员积分,查找应当如何进行?VIP号 姓名 飞行里程(KM) 积分600214 韩江辉 16801 519601278 蒋志来 5321 78600815 李亚东 28745 436607854 王庆生 1861 39605719 李燕 7493 138603532 王晓燕 6875 102600101 郑煜明 14253 236600087 蔡佳宁 112703 958(二)设计算法与数据结构:请思考:数据组织形式有两种,哪种更适合?数据查找算法有两种,哪种更方便?(二)设计算法与数据结构数据组织形式有两种,哪种更方便?方法一是采用4个一维数组按列存储,即每个数组分别存储每个用户的VIP号、姓名、飞行里程(KM) 、积分等,如定义a数组存储表中每个用户的VIP号,其对应的值为[“600214”,” 601278 ” ,” 600815 ” ,” 607854” , ” 605719” ……];定义b数组存储表中姓名;定义c数组存储表中飞行里程(KM);定义d数组存储表中积分信息。a b c dVIP号 姓名 飞行里程(KM) 积分600214 韩江辉 16801 519601278 蒋志来 5321 78600815 李亚东 28745 436607854 王庆生 1861 39605719 李燕 7493 138603532 王晓燕 6875 102600101 郑煜明 14253 236600087 蔡佳宁 112703 958b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]d[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7](二)设计算法与数据结构数据组织形式有两种,哪种更方便?方法二是采用1个一维数组按行存储,每个数组元素对应某个国家的一条记录信息,如a[1]为[600214,韩江辉,16801 ,519]对应第一条记录的相关信息。VIP号为索引值[0]的元素积分为索引值[3]的元素VIP号 姓名 飞行里程(KM) 积分600214 韩江辉 16801 519601278 蒋志来 5321 78600815 李亚东 28745 436607854 王庆生 1861 39605719 李燕 7493 138603532 王晓燕 6875 102600101 郑煜明 14253 236600087 蔡佳宁 112703 958a[i][0] a[i][1] a[i][2] a[i][3]a[1][0] a[1][1] a[1][2] a[1][3]a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7](二)设计算法与数据结构:请思考:数据查找算法有两种,哪种更方便?查找可采用顺序查找算法或二分查找算法,对数据进行一次查找,采用顺序查找算法。对数据重复查找,二分查找算法的效率高于顺序查找算法,但二分查找提前:被查找的数据序列必须是有序,即在查找VIP号前要按VIP号为关键字进行排序。(三)编写程序并调试#数据读入import csv #导入csv模块csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile) )#建立一个读入数据的对象readera = [] #定义空列表afor item in reader: #每一行为a列表一个元素a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件for i in range(len(a)): #输出VIP表信息print(a[i])key=input('请输入要查询的VIP号:') #输入要查询的VIP号:key为字符串#顺序查找f=False #设置没查找标记for i in range(1,len(a)): #查询范围不包含第一行数据if a[i][0]==key: #逐一比较m=i #记录找到了的位置f=True #标记查找成功break #结束查找if f==True: #标记查找成功,输出信息print(a[m][1],"先生/女士,',您的积分为:",a[m][3])else: #查找不成功,输出信息print('找不到VIP号对应的用户信息!')(算法一:顺序查找)待查询文件在vip.csv中VIP号 姓名 飞行里程(KM) 积分600214 韩江辉 16801 519601278 蒋志来 5321 78600815 李亚东 28745 436607854 王庆生 1861 39VIP号 姓名 飞行里程(KM) 积分(三)编写程序并调试#数据读入import csv #导入csv模块csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile) )#建立一个读入数据的对象readera = [] #定义空列表afor item in reader: #每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件for i in range(len(a)): #输出VIP表信息print(a[i])key=input('请输入要查询的VIP号:') #输入要查询的VIP号:key为字符串#顺序查找f=False #设置没查找标记for i in range(1,len(a)): #查询范围不包含第1行数据if a[i][0]==key: #逐一比较m=i #记录找到了的位置f=True #标记查找成功break #结束查找if f==True: #标记查找成功,输出信息print(a[m][1],"先生/女士,',您的积分为:",a[m][3])else: #查找不成功,输出信息print('找不到VIP号对应的用户信息!')(算法一:顺序查找)#数据读入import csv #导入csv模块csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile) #建立一个读入数据的对象readera = [] #定义空列表afor item in reader: #每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件for i in range(len(a)): #输出VIP表信息print(a[i])key=input('请输入要查询的VIP号:') #输入要查询的VIP号:key为字符#顺序查找def seq_search(a,key):global m #定义全局变量mf=False #设置没查找标记for i in range(1,len(a)): #查询范围不包含第一行数据if a[i][0] ==key: #逐一比较f=True #标记查找成功m=i #记录找到了的位置break #结束查找return f #返回ff=seq_search(a,key)if f==True: #标记查找成功,输出信息print(a[m][1],"先生/女士,',您的积分为:",a[m][3])else: #查找不成功,输出信息print('找不到VIP号对应的用户信息!')(三)编写程序并调试(算法一:顺序查找)#数据读入import csv #导入csv模块csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile) #建立一个读入数据的对象readera = [] #定义空列表afor item in reader: #每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件for i in range(len(a)): #输出VIP表信息print(a[i])key=input('请输入要查询的VIP号:') #输入要查询的VIP号:key为字符#顺序查找def seq_search(a,key):global m #定义全局变量mf=False #设置没查找标记for i in range(1,len(a)): #查询范围不包含第一行数据if a[i][0] ==key: #逐一比较f=True #标记查找成功m=i #记录找到了的位置break #结束查找return f #返回ff=seq_search(a,key)if f==True: #标记查找成功,输出信息print(a[m][1],"先生/女士,',您的积分为:",a[m][3])else: #查找不成功,输出信息print('找不到VIP号对应的用户信息!')(三)编写程序并调试(算法二:二分查找)import csv #导入csv模块#数据读入csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile)#建立一个读入数据的对象readera = [] #定义空列表afor item in reader:#每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件#冒泡排序for i in range(1,len(a)):for j in range(1,len(a)-i):if int(a[j][0])>int(a[j+1][0]): #升序排序a[j],a[j+1]=a[j+1],a[j]print('排序后:')for i in range(len(a)):#输出排序后的VIP表信息print(a[i])key=int(input('请输入要查询的VIP号:'))#二分查找i = 1 #查找范围不包含第一行数据,左端点初值1j = len(a)-1 #右端点初值为最后一个元素索引值f=False #设置查找标记while i <= j:m = (i+j) //2 #确定中点if int(a[m][0]) ==key:#key与中点VIP号相等f=True #标记查找成功break #结束查找if key < int(a[m][0]): #key<中点VIP号j = m-1 #到左半区间找else: #key>中点VIP号i = m+1 #到右边区间找if f==True: #标记查找成功,输出信息print(a[m][1],"先生/女士,您的积分为:",a[m][3])else:print('找不到VIP号对应的用户信息!')(三)编写程序并调试(算法二:二分查找)import csv #导入csv模块#数据读入csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile)#建立一个读入数据的对象readera = [] #定义空列表afor item in reader:#每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件#冒泡排序for i in range(1,len(a)):for j in range(1,len(a)-i):if int(a[j][0])>int(a[j+1][0]): #升序排序a[j],a[j+1]=a[j+1],a[j]print('排序后:')for i in range(len(a)):#输出排序后的VIP表信息print(a[i])key=int(input('请输入要查询的VIP号:'))#二分查找i = 1 #查找范围不包含第一行数据,左端点初值1j = len(a)-1 #右端点初值为最后一个元素索引值f=False #设置查找标记while i <= j:m = (i+j) //2 #确定中点if int(a[m][0]) ==key:#key与中点VIP号相等f=True #标记查找成功break #结束查找if key < int(a[m][0]): #key<中点VIP号j = m-1 #到左半区间找else: #key>中点VIP号i = m+1 #到右边区间找if f==True: #标记查找成功,输出信息print(a[m][1],"先生/女士,您的积分为:",a[m][3])else:print('找不到VIP号对应的用户信息!')(三)编写程序并调试(算法二:二分查找)import csv #导入csv模块#数据读入csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile)#建立一个读入数据的对象readera = [] #定义空列表afor item in reader:#每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件#冒泡排序函数def bubble_sort(d):for i in range(1,len(d)):for j in range(1,len(d)-i):if int(d[j][0])>int(d[j+1][0]):#升序排序d[j],d[j+1]=d[j+1],d[j]#二分查找函数def bsearch(s,array):i = 1 #查找范围不包含第一行数据,左端点初值1j = len(array)-1#右端点初值为最后一个元素索引值f=False #设置查找标记while i <= j:m = (i+j) //2 #确定中点if int(array[m][0]) ==s:#s与中点VIP号相等return m #找到就结束查找,返回中点mif s < int(array[m][0]):#s<中点VIP号j = m-1 #到左边区间找else: #s>中点VIP号i = m + 1 #到右边区间找return -1 #未找到返回-1#主程序bubble_sort(a) #调用冒泡排序print('排序后:')for i in range(len(a)):#输出排序后的VIP表信息print(a[i])key=int(input('请输入要查询的VIP号:'))m=bsearch(key,a) #调用二分查找函数if m !=-1: #标记查找成功,输出信息print(a[m][1],"先生/女士,',您的积分为:",a[m][3])else: #未找到print('找不到VIP号对应的用户信息!')(三)编写程序并调试(算法二:二分查找)import csv #导入csv模块#数据读入csvFile = open("vip.csv", "r") #打开vip.csv数据文件reader = csv.reader(csvFile)#建立一个读入数据的对象readera = [] #定义空列表afor item in reader:#每一行为a列表一个元素,此元素为字符串a.append(item) #csv通过这种样式读入的数据为字符串csvFile.close() #关闭vip.csv数据文件#冒泡排序函数def bsort(d):for i in range(1,len(d)):for j in range(1,len(d)-i):if int(d[j][0])>int(d[j+1][0]):#升序排序d[j],d[j+1]=d[j+1],d[j]#二分查找函数def bsearch(s,array):i = 1 #查找范围不包含第一行数据,左端点初值1j = len(array)-1#右端点初值为最后一个元素索引值f=False #设置查找标记while i <= j:m = (i+j) //2 #确定中点if int(array[m][0]) ==s:#s与中点VIP号相等return m #找到就结束查找,返回中点mif s < int(array[m][0]):#s<中点VIP号j = m-1 #到左边区间找else: #s>中点VIP号i = m + 1 #到右边区间找return -1 #未找到返回-1#主程序bsort(a) #调用冒泡排序print('排序后:')for i in range(len(a)):#输出排序后的VIP表信息print(a[i])key=int(input('请输入要查询的VIP号:'))m=bsearch(key,a) #调用二分查找函数if m !=-1: #标记查找成功,输出信息print(a[m][1],"先生/女士,',您的积分为:",a[m][3])else: #未找到print('找不到VIP号对应的用户信息!')学习生活中的应用实践:校园一卡通号码查询。某校共n名学生,严老师编写了一个校园一卡通号码查询程序,输入号码就能查询该号码所属的班级和学生姓名。如右图所示所有学生数据存储在“校园一卡通.csv”表格中,该表格分别保存了本校所有学生的号码、所在班级和姓名的信息,号码的编码规则为入学年份+班级加身份证号后三位。第i个学生的号码保存在第1列中,对应的班级和姓名保存在第2列和第3列中。输入号码,电脑开始查找该号码的信息,如果找到对应的信息,就显示所属班级和姓名,如果没有找到,则显示“没有查询到该号码信息!”。学习生活中的应用实践:相应程序如下,请在程序划线①②③处填入相应的代码,把程序补充完整。import csvflie1=open('校园一卡通.csv','r')reader=csv.reader(flie1)st=[]for it in reader:①flie1.close()# 冒泡排序for i in range(1,len(st)-1):for j in range(len(st)-1,i,-1):if ② :st[j],st[j-1]=st[j-1],st[j]for i in range(len(st)):print(st[i])# 二分查找key=input(‘请输入需要查找的卡号:')i=1;j=len(st)-1while i<=j:m=(i+j)//2if ③ :i=m+1else:j=m-1if st[i][0]==key:print(st[0])print(st[i])else:print("没有该号码信息!")st.append(it)st[j][0]st[m][0]读取csv文件数据st[m][0]>=key课堂小结抽象与建模编写程序并调试查找算法的应用设计算法与数据结构学习评价对自己的表现进行客观的评价,并思考后续完善的方向。(3=优秀,2=一般,1=仍需加油)评分项 自我评价能对vip.csv文件中的数据进行抽象并建立模型 3 2 1能对vip.csv数据选用合适的数据结构,设计查找算法 3 2 1能用Python语言编写具体的查找程序。 3 2 1能自觉对学习生活具体问题抽象建模、设计算法并编写程序及调试程序,如:查找姓名、查找校园卡号等实际应用。 3 2 1课后作业:2.用二分查找实现开平方根函数squareroot(x,p)。x是被开方的数,假定输入的数都为非负数整数,p是误差上限,输出一个浮点数结果。程序代码如下,请在划线处填入合适的代码。def ① :if x<0:return -1a=0b=xwhile a<=b:②if abs(m**2-x)return melif m**2>x:③else:a=mprint(square(2,0.01))print(square(1,0.01))print(square(9,0.01))print(square(100,0.01))1.D2.①square(x,p) ②m=(a+b)/2③b=m1.已知输入a[0]至a[7]的值依次为“88,79,62,55,46,31,20,1”,查找某key值的程序段如下:i=0;j=7;n=0key=int(input())while i<=j:m=(i+j)//2if key==a[m]:breakelif key>a[m]:j=m-1;n-=1else:i=m+1;n+=1print(n)当输入不同的key值,运行该程序后,输出的不同结果共有:A.5种 B.6种C.7种 D.8种课后作业:3.某超市商品销售表结构如下图所示,为了模拟超市销售系统的部分功能,某程序具有功能如下:1)程序运行后自动从shangpin.xlsx表中读取商品信息,2)并按照“商品编号”从小到大的顺序将所有商品信息排序。3)用户输入一个商品编号 ,程序自动查找是否存在该商品,若找到该商品,将该商品的销量加1,并返回“操作已成功”的提示信息,若找不到该商品,则提示“不存在该商品”的提示信息。程序代码如下,请在划线处填入合适的代码。import pandas as pddef check(x,y):i=xj=yflag=Falsewhile ① :m=(i+j)//2if int(a[m][0])==key:flag=Trueelif int(a[m][0])>key:j=m-1else:②if flag:a[m][3]=int(a[m][3])+1return flagif __name__=='__main__':df=pd.read_excel('shangpin.xlsx') #读取文件a=df.values.tolist() #将Excel表中的数据转换成列表#排序n=len(a)for i in range(1,n):for j in range(n-i):if int(a[j][0])>int(a[j+1][0]):a[j],a[j+1]= a[j+1],a[j]key=int(input("请输入商品编号:"))if ③ :df=pd.DataFrame(a,columns=['商品编号','商品名称','单价','销售量'])④ #存入shangpin2.xlsx文件中print("恭喜,操作已完成!")else:print("对不起,不存在该商品,请重新输入!")①i<=j and not flag②i=m+1③check(0,n-1)④df.to_excel("shangpin2.xlsx",index=False) 展开更多...... 收起↑ 资源预览