裴波那契查找詳解 - Python實現


  裴波那契查找(Fibonacci Search)是利用黃金分割原理實現的查找方法。

  斐波那契查找的核心是:

   1.當key == a[mid]時,查找成功;

   2.當key < a[mid]時,新的查找范圍是low至mid-1, 此時范圍個數為F[k-1] - 1個,即數組左邊的長度;

   3.當key < a[mid]時,新的查找范圍是mid+1至high,此時范圍個數為F[k-2] - 1個,即數組右邊的長度;

import random

#source為待查找數組,key為要查找的數
def fibonacciSearch(source,key):
    #生成裴波那契數列
    fib = [0,1]
    for i in range(1,36):
        fib.append(fib[-1]+fib[-2])

    #確定待查找數組在裴波那契數列的位置
    k = 0
    n = len(source)

    #此處 n>fib[k]-1 也是別有深意的
    #若n恰好是裴波那契數列上某一項,且要查找的元素正好在最后一位,此時必須將數組長度填充到數列下一項的數字
    while(n > fib[k]-1):
        k = k + 1
    
    #將待查找數組填充到指定的長度
    for i in range(n,fib[k]):
        a.append(a[-1])

    low,high = 0,n-1

    while(low <= high):

        #獲取黃金分割位置元素下標
        mid = low + fib[k-1] - 1
        
        if(key < a[mid]):
            #若key比這個元素小,則key值應該在low至mid-1之間,剩下的范圍個數為F(k-1)-1
            high = mid - 1
            k = k -1
        elif(key > a[mid]):
            #若key比這個元素大,則key至應該在mid+1至high之間,剩下的元素個數為F(k)-F(k-1)-1=F(k-2)-1
            low = mid + 1
            k = k - 2
        else:
            if(mid < n):
                return mid
            else:
                return n-1

    return -1


### 函數測試 ###

#生成待查找的數組
a = [random.randint(1,100000) for x in range(0,33)]
a.append(673990)
a.sort()

#待查找的數
key = 673990

#輸出查找到的位置下標
print(fibonacciSearch(a,key))

 Python新手,如有不對的地方請指正。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM