アルゴリズムを見つける
線形検索
定義:データセット(リスト)に特定の値が存在するかどうかを確認し、その格納場所の添え字を返すことです。検索アルゴリズムが解決する必要がある最も重要な問題は、最短の時間でターゲット値にアプローチする方法です。
線形探索:方法が使用されないことを意味し、最初から最後まで直接1つずつ判断されます。しかし、暴力は単純なので、リストを注文する必要はありません。
def lineSearch(arr,num):
flag = 0
for i in range(len(arr)):
if arr[i]==num:
flag=1
print("找到了,在第{}个位置".format(i+1))
if flag==0:
print("没有找到!")
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
lineSearch(arr,9000000-1)
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
二分探索
バイナリ検索:検索するデータが順序付けられていることを確認する必要があります。その検索戦略は、最初に中間値を判断し、それをターゲット値と比較します。大きい場合は、左側のデータの小さい方の半分を破棄します。小さい場合は、右側のデータの大きい方の半分を破棄します。順序付けされたデータのバイナリ検索の時間効率はO(logn)です。
def binarySearch(arr,left,right,findVal):
#定义一个数组储存下标,又可能存在多个相同元素
resIndex = []
#arr必须有序
mid = int((left+right)/2)
midVal = arr[mid]
if left>right:
return -1
if findVal > midVal:
return binarySearch(arr,mid+1,right,findVal)
elif findVal<midVal:
return binarySearch(arr,left,mid-1,findVal)
else:
temp = mid - 1
while(True):#左边
if temp>len(arr)-1 or arr[temp]!=findVal:
break
resIndex.append(temp+1)
temp-=1
resIndex.append(mid+1)#中间
temp=mid+1
while(True):#右边
if temp<0 or arr[temp]!=findVal:
break
resIndex.append(temp+1)
temp+=1
return resIndex
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
print("Index="+str(binarySearch(arr,0,len(arr),1)))
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
補間ルックアップ
内挿検索:内挿検索はバイナリ検索に基づいて部分的に改善されているため、データの順序付けも必要です。各バイナリ検索の中央=(左+右)/ 2の計算方法を直接改善します。数学的分析の知識を使用して、分割点を**左+(右左)*(int((findVal-arr [左])/(arr [右] -arr [左])))**に変更しました。ただし、使用する前に、ターゲット値がデータの最大値よりも大きいか、またはデータの最小値よりも小さいかを判別する必要があります。そうしないと、国境を越えるリスクがあります。
def insertSearch(arr,left,right,findVal):
#定义一个数组储存下标,又可能存在多个相同元素
resIndex = []
#arr必须有序
if left>right or findVal<arr[0] or findVal>arr[len(arr)-1]:
return -1
mid = left + (right-left)*(int((findVal-arr[left])/(arr[right]-arr[left])))
midVal = arr[mid]
if findVal > midVal:
return insertSearch(arr,mid+1,right,findVal)
elif findVal<midVal:
return insertSearch(arr,left,mid-1,findVal)
else:
temp = mid - 1
while(True):#左边
if temp>len(arr)-1 or arr[temp]!=findVal:
break
resIndex.append(temp+1)
temp-=1
resIndex.append(mid+1)#中间
temp=mid+1
while(True):#右边
if temp<0 or arr[temp]!=findVal:
break
resIndex.append(temp+1)
temp+=1
return resIndex
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
print("Index="+str(insertSearch(arr,0,len(arr)-1,1)))
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
フィボナッチルックアップ
フィボナッチ検索:上記の2つの検索方法を読んだ後、検索アルゴリズムはデータを分離して目標値に近づくアルゴリズムであり、数学的には古典的な分割方法-黄金分割0.618があることがわかります。そして、ゴールデンセクションは、フィボナッチ数列と数学的に関係しています。フィボナッチ数列を使用して前の数と次の数を除算すると、たまたま黄金比に近づきます。これから、新しい検索アルゴリズムであるフィボナッチ検索を作成しました。
import copy
#arr = [1,8,10,89,1000,1234]
import time
arr = [0 for i in range(9000)]
for i in range(9000):
arr[i]=i
def fib():#非递归
f = [0 for i in range(9000)]
f[0]=1
f[1]=1
for i in range(2,9000,1):
f[i]=f[i-1]+f[i-2]
return f
def fibSearch(arr,key):
low = 0
high=len(arr)-1
k = 0 #分割数字的下标
mid = 0
f = fib()
#获取斐波那契分隔数的下标
while(high>f[k]-1):
k+=1
temp = copy.deepcopy(arr)
for i in range(high+1,f[k],1):
temp.append(arr[high])
while(low<=high):
mid = low+f[k-1]-1
if key<temp[mid]:#左边查找
high=mid-1
k-=1
elif key>temp[mid]:#右边查找
low=mid+1
k-=2
else:
if mid<=high:
return mid
else:
return high
return -1
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))
print("Index="+str(fibSearch(arr,11) ))
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))