前言
本文主要介绍常用的两种简单查找方法:顺序查找以及二分查找
一、顺序查找
顺序查找是所有查找方法种最简单的一种,在一个数组中,顺序查找就是按数据的下标从小到大查找,其时间复杂度为O(n)。
顺序查找的算法:
#顺序查找 arr=list(map(int,input().split(','))) key=int(input()) flag=0 for i in range(len(arr)): if arr[i]==key: print(i) flag=1 break if flag==0: print(-1)
顺序查找主要运用一个for循环遍历整个列表,查找到就输出其下标,否则输出-1(可以设置一个标志flag来判断是否查找成功)
二、二分查找
二分查找,也叫折半查找,是一种适用于顺序存储结构的查找方法。二分查找主要运用左右两个指针来标注查找范围。每一次循环过后,查找范围都缩小为原来的一半,直到左右指针重叠或者左指针处于右指针的右侧,其时间复杂度为O(lgn)
二分查找的算法:
#二分查找 arr=list(map(int,input().split(','))) l,r=0,len(arr)-1 (1) key=int(input()) (2) while l<=r: (3) mid=(l+r)//2 (4) if arr[mid]<key: (5) l=mid+1 elif arr[mid]>key: r=mid-1 else: print(mid) break
(1)初始化左右指针
(2)输入要查找的元素
(3)开始循环
(4)中间值
(5)由于有序表,所以小于中间值的都在中间值左边,大于中间值的都在右边,如此循环下去直到等于中间值即查找成功
三、问题引入
1. 求列表中不大于key的最大值
可以先将列表元素进行排序,然后利用二分查找方法进行查找,具体算法如下:
程序设计
lst=list(map(int,input().split(' '))) for i in range(1,len(lst)): t=lst[i] for j in range(i): if lst[i]<lst[j]: lst.pop(i) lst.insert(j,t) break l,r=0,len(lst)-1 key=int(input()) while(l<r): mid=(l+r+1)//2 if lst[mid]<=key: l=mid else: r=mid-1 print(l)
(1)首先利用插入排序对其进行排序
(2)然后巧用二分查找即可
程序分析
这段程序的功能是:接受一行输入,将输入转化为一个列表lst,然后将列表按照升序排序,接着输入一个关键字key,使用二分查找在排序后的列表中找到小于等于该关键字的最大值的下标。
程序的具体实现思路如下:
1. 接受输入,将输入转化为一个列表lst。
lst=list(map(int,input().split(' ')))
这里使用了`map()`函数将输入的一行字符串转化为整数类型,并将转化后的结果存储在一个列表lst中。
2. 对列表lst进行插入排序。
for i in range(1,len(lst)): t=lst[i] for j in range(i): if lst[i]<lst[j]: lst.pop(i) lst.insert(j,t) break
这里使用了插入排序的思想,将每个元素遍历插入到已排序的部分中。具体实现是,将当前元素t存储在变量t中,然后从已排序的部分的开头开始往后遍历,找到第一个比t大的元素插入到该元素之前。
3. 使用二分查找在排序后的列表lst中找到小于等于给定关键字key的最大值的下标。
l,r=0,len(lst)-1 key=int(input()) while(l<r): mid=(l+r+1)//2 if lst[mid]<=key: l=mid else: r=mid-1 print(l)
这里使用了二分查找的思想,将列表划分为左半部分和右半部分,每次将中间位置的元素和给定关键字key进行比较,如果中间位置的元素小于等于key,则在右半部分继续查找,否则在左半部分查找。一直重复这个过程,直到左右指针l和r相遇,此时返回左指针的值即可。
综上,这段程序的思路清晰,实现简洁,可以很好地完成所需的功能。
总结
本文主要介绍了两种常用的查找方法,顺序查找较为简单,二分查找较为常用