无序表查找
线性查找 O( n )
适用于线性表的顺序存储结构和链式存储结构。
#无序数列遍历查找
def unordered_search(lis,key):
for i in range(len(lis)):
if lis[i] == key:
return i
return False
assert unordered_search([1,2,3,2,1,4,5],6)==False
assert unordered_search([1,2,3,2,1,4,5],3)==2
有序表查找
对半分割数列
#递增数列二分查找
def binary_search(lis, key):
l, h = 0, len(lis) - 1
while l <= h:
mid = (l + h)//2
if lis[mid] == key:
return mid
elif lis[mid] > key:
h = mid - 1
elif lis[mid] < key:
l = mid + 1
return False
assert binary_search([1,2,3,2,1,4,5],6)==False
assert binary_search([1,2,3,2,1,4,5],4)==5
复杂度分析
时间复杂度:折半搜索每次把搜索区域减少一半,时间复杂度为 O(logn)
空间复杂度:O(1)
插值查找 O( log(n) )
按差值比例分割数列
对二分查找的优化,让问题规模更快的缩减
value =low + int( (high - low) * (key - list[low]) / (list[high] - list[low]) )
用此 value 成比例代替二分查找中的中间值。
但是当 key 值过大, value 有可能会超出列表范围。需要额外判定。
# 递 增数列插值查找
def interpolation(lis, key):
l, h = 0, len(lis) - 1
while l <= h:
mid = l + int((h - l) * (key - lis[l]) / (lis[h] - lis