查找
常见查找算法:顺序查找,二分法,二叉树,哈希
选择查找方法需要考虑的因素:
查找速度
应用场景
资源占用
数据结构相关性:讨论查找算法的时候,首先要明确是在什么数据结构上执行查找算法
不同的数据结构有不同的查找算法,有的数据结构就是为了查找而生,如二叉树、哈希
顺序查找
遍历序列,将序列中的元素与被查找的数据逐一作比较
顺序查找对被检索的序列没有任何要求
复杂度:时间复杂度:O(n)
二分法 binarySearch
二分法只适用于已经完成排序的序列
通过把序列中间的数与被查找的数据不断作比较来确定被查找的数所处的范围
复杂度:最优时间复杂度:O(1)
最差时间复杂度:O(logn)
方法一
def binary_search1(varlist,item):
# 首尾两个位置
first = 0
last = len(varlist) - 1
# first=last时还剩最后一个值,所以还需要比较
while first <= last :
# 根据首尾找到中间位置
midpoint = (first + last) // 2
if item == varlist[midpoint] :
return True
# 被查找元素小于中间的数,则改变last,在左边继续二分
elif item < varlist[midpoint] :
last = midpoint - 1
# 被查找元素大于中间的数,则改变first,在右边继续二分
elif item > varlist[midpoint] :
first = midpoint + 1
return False
varl = [3,15,26,57,78,128,258,438]
res = binary_search1(varl,57)
print(res)
True
方法二:递归
def binary_search2(varlist,item):
# 结束递归的条件,比较完序列中所有元素
if len(varlist) == 0 :
return False
else:
# 找到中间位置
midpoint = len(varlist) // 2
if item == varlist[midpoint] :
return True
# 调用自身来修改查找范围
elif item < varlist[midpoint] :
return binary_search2(varlist[:midpoint],item)
else :
return binary_search2(varlist[midpoint+1:],item)
varl = [3,15,26,57,78,128,258,438]
res = binary_search2(varl,3)
print(res)
True