线性查找,顺序查找,
缺点,枚举法慢。优点,不需要排序
复杂度O(n)
值循环
for i in a:
if i==x:
print(a.index(x))
break
else:
print(-1)
下标for ...else循环
for i in range(len(a)):
if a[i]==x:
print(i)
break
else:
print(-1)
while...else循环
i=0
while i<len(a):
if a[i]==x:
print(i)
break
i+=1
else:
print(-1)
标志变量f 通用语法
x=18
i=0
f=0
while i<len(a) and f==0:
if a[i]==x:
print(i)
f=1
i+=1
if f==0:
print(-1)
else:
print(i)
二分法查找for...else 或 while...else
不断的缩小范围查找范围内的中间值。
缺点,需要排序。
复杂度O(logn)
l, r = 0, len(a)-1
for i in range(l,r):
while l<=r:
m=(r+l)//2
if x>a[m]:
l=m+1
elif x<a[m]:
r=m-1
else:
print(m)
break
else:
print(-1)
加标志变量
l, r = 0, len(a)-1
f=0
for i in range(l,r):
while l<=r and f==0:
m=(r+l)//2
if x>a[m]:
l=m+1
elif x<a[m]:
r=m-1
else:
#print(m)
f=1
if f==0:
print(-1)
else:
print(m)
插序查找
不断的查找目标的插值(估值),在估值以上的值查找需要的值。
缺点,需要排序。
复杂度O(loglogn)
插值比较小
标志变量
l, r = 0, len(a)-1
f=1
for i in range(l,r):
while l <= r and f==1:
m=l+int((r-l)/(a[r]-a[l])*(x-a[l]))
if x>a[m]:
l=m+1
else:
print(m)
f=0
if f==1:
print(-1)
斐波那契查找O(log2n)
分块查找O(log(m) + N/m)
哈希查找O(1)