·查找:在一些数据元素中,通过一定的方法,找出与给定关键字相同的数据元素的过程。
·列表查找,也称为线性表查找:从列表中查找指定元素。
输入:列表、待查找元素
输出:元素下标(未找到元素时一般返回None或-1)
·内置列表查找函数:index()
顺序查找(Linear Search)
也叫线性查找,从列表的第一个元素开始,顺序进行搜索,查到找到元素或搜索到列表最后一个元素为止。
def linear_search(li,val):
for ind,v in enumerate(li):
if v==val:
return ind
else:
return -1
时间复杂度:O(n)
二分查找(Binary Search)
也叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。
def binary_search(li,val):
left=0
right=len(li)-1
while left<=right:#候选区有值
mid=(left+right)//2
if li[mid]<val:
left=mid+1
elif li[mid]>val:
right=mid-1
else:
return mid
else:
return -1
时间复杂度:O(logn)
总结:
(1)内置函数index()是顺序查找,因为二分查找要求列表是有序的。
(2)查找方法的选择:如果列表是有序的,直接用二分查找;如果列表是无序的,且查找次数较少,顺序查找更好,因为二分查找需要首先为列表排序,而排序的时间复杂度大于O(n);如果查找次数较多,那尽量先排序,之后二分查找。
说明:
本篇博客只是作为个人的听课笔记使用。具体课程为b站上清华大学博士讲解的数据结构与算法,课程讲的非常详细易懂,有需要的可以移步观看。