裴波那契查找(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新手,如有不對的地方請指正。

