Quatro algoritmos de busca

Encontrar algoritmo

Pesquisa linear

Definição: é para descobrir se existe um determinado valor em um conjunto de dados (lista) e retornar o subscrito de seu local de armazenamento. O problema mais importante que o algoritmo de pesquisa precisa resolver é como abordar o valor-alvo no menor tempo possível.
Pesquisa linear : significa que nenhum método é usado e é julgado um por um diretamente do começo ao fim. Mas, como a violência é simples, não há necessidade de a lista ser ordenada.

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()))

Pesquisa binária

Pesquisa binária : você deve garantir que os dados que estão sendo pesquisados ​​estejam ordenados. Sua estratégia de busca é: primeiro julgar o valor intermediário e compará-lo com o valor-alvo; se for maior, descarte a metade menor dos dados à esquerda; se menor que, descarte a metade maior dos dados à direita; se forem iguais, foi encontrado. A eficiência de tempo da pesquisa binária para dados ordenados é 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()))

Pesquisa de interpolação

Pesquisa de interpolação : a pesquisa de interpolação é parcialmente aprimorada com base na pesquisa binária, portanto, também é necessário solicitar os dados. Ele melhora o método de cálculo do meio = (esquerda + direita) / 2 diretamente para cada pesquisa binária. Usando o conhecimento da análise matemática, o ponto de divisão foi alterado para ** esquerda + (direita-esquerda) * (int ((findVal-arr [esquerda]) / (arr [direita] -arr [esquerda]))), No entanto, antes do uso, é necessário determinar se o valor-alvo é maior que o valor máximo dos dados ou menor que o valor mínimo dos dados; caso contrário, haverá risco de transfronteiriço.

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()))

Pesquisa de Fibonacci

Pesquisa de Fibonacci : Após ler os dois métodos de pesquisa acima, você descobre que o algoritmo de pesquisa é um algoritmo que separa os dados e se aproxima do valor-alvo, e matematicamente existe um método de divisão clássico - a seção de ouro 0,618. E a seção dourada passa a ter uma relação matemática com a sequência de Fibonacci. Usando a sequência de Fibonacci para dividir o número anterior e o próximo número, acontece que ele se aproxima da proporção áurea. A partir disso, produzimos um novo algoritmo de busca: busca de Fibonacci.

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())) 
Publicado 27 artigos originais · elogiado 2 · visitas 680

Acho que você gosta

Origin blog.csdn.net/qq_44273739/article/details/105380816
Recomendado
Clasificación