七大查詢演算法之有序表查詢 斐波那契查詢

2021-08-29 13:47:57 字數 1175 閱讀 3740

**比例又稱**分割,是指事物各部分間一定的數學比例關係,即將整體一分為二,較大部分與較小部分之比等於整體與較大部分之比,其比值約為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...