4つの検索アルゴリズム

アルゴリズムを見つける

線形検索

定義:データセット(リスト)に特定の値が存在するかどうかを確認し、その格納場所の添え字を返すことです。検索アルゴリズムが解決する必要がある最も重要な問題は、最短の時間でターゲット値にアプローチする方法です。
線形探索:方法が使用されないことを意味し、最初から最後まで直接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())) 
元の記事を27件公開 賞賛2件 680回の訪問

おすすめ

転載: blog.csdn.net/qq_44273739/article/details/105380816