**比例又稱**分割,是指事物各部分間一定的數學比例關係,即將整體一分為二,較大部分與較小部分之比等於整體與較大部分之比,其比值約為1:0.618或1.618:1。
斐波那契查詢也是二分查詢的一種提公升演算法,通過運用**比例的概念在數列中選擇查詢點進行查詢,提高查詢效率。同樣地,斐波那契查詢也屬於一種有序查詢演算法。其核心也是如何優化那個縮減速率,使得查詢次數盡量降低。
斐波那契查詢與折半查詢很相似,是根據斐波那契序列的特點對有序表進行分割的。要求開始表中記錄的個數為某個斐波那契數小1,及n = f(k)-1
斐波那契查詢的核心是:
def fibonaccisearch(data, length, key):
f = [0, 1]
count = 1
low = 0
high = length - 1
if (key < data[low] or key > data[high]): # 索引超出範圍返回錯誤
print("error!!! the ", key, " is not in the data!!!")
return -1
while f[count] < length: # 生成斐波那契數列
count = count + 1
low = f[0]
high = f[count]
while length - 1 < f[count - 1]: # 將資料個數補全
length = length + 1
while (low <= high):
mid = low + f[count - 1] # 計算當前分割下標
if (data[mid] > key): # 若查詢記錄小於當前分割記錄
high = mid - 1 # 調整分割記錄
count = count - 1
elif (data[mid] < key): # 若查詢記錄大於當前分割記錄
low = mid + 1
count = count - 2
else: # 若查詢記錄等於當前分割記錄
return mid
斐波那契查詢的整體時間複雜度也為o(log(n))。但就平均效能,要優於二分查詢。但是在最壞情況下,比如這裡如果key為1,則始終處於左側半區查詢,此時其效率要低於二分查詢。 演算法 查詢 斐波那契查詢
相對於二分查詢和差值查詢,斐波那契查詢的實現略顯複雜。但是在明白它的主體思想之後,掌握起來也並不太難。既然叫斐波那契查詢,首先得弄明白什麼是斐波那契數列。相信大家對這個著名的數列也並不陌生,無論是c語言的迴圈 遞迴,還是高數的數列,斐波那契數列都是乙個重要的存在。而此處主要是用到了它的一條性質 前乙...
斐波那契查詢演算法
與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。include void fibonacci int f int fibonacci search int a,int key,int n...
斐波那契查詢演算法
斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當keya mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。如下 1 include2 include 3 include4 includ...