LeetCode 斐波那契查詢(Python版)

2021-10-23 08:18:41 字數 2656 閱讀 2241

斐波那契數列(fibonacci)又稱**分割數列,指的是這樣乙個數列:1,1,2,3,5,8,13,21,…

在數學上,斐波那契被遞迴方法如下定義:f(1) = 1;f(2) = 1;f(n) = f(n-1)+f(n-2) (n>=2),該數列越往後,相鄰的兩個數的比值越趨於**比例值(0.618)。斐波那契查詢就是在二分法查詢的基礎上根據斐波那契數列進行分割。

斐波那契查詢為二分法查詢的變種,也需要提前對數列記性排序,當被查詢數列長度為20時,二分法首次查詢選擇的是數列中第10個元素做參考物。fibonacci首次查詢按照選取的是數列中第13個元素做參考物。如果被查詢數列長度為100,二分法首次查詢選擇的是數列第50個元素做參照物。而斐波那契數首次查詢選取的數列中第89個元素做參考物,數列越長,選擇參考點的位置差別越大。具體需要根據斐波那契數列的遞迴方法選取得到。

【csdn】斐波那契查詢參考

import random

import timeit

defrandomlist

(n):

ilist =

for i in

range

(n):0,

1000))

return ilist

defquicksort

(ilist):if

(len

(ilist)

<=1)

:return ilist

left =

right =

for i in ilist[1:

]:if i<=ilist[0]

:else

:return quicksort(left)

+[ilist[0]

]+quicksort(right)

deffibonacci

(n):

ilist =[1

,1] k = n;

while

(k>1)

:#獲取的斐波那契數列第n位資料,即要查詢列表的位置

#ilist[-1]、ilist[-2]表示列表最後一位數的前兩位資料-1

]+ ilist[-2

])k -=

1return ilist[-1

]def

fibonaccisearch

(ilist,key)

: ilen =

len(ilist)

left =

0 right = ilen -1if

(ilen ==0)

:return-1

#########斐波那契數列的長度k#########

k =1while fibonacci(k)-1

< ilen-1:

k +=

1###################################

while right - left >1:

#20個數的數列查詢,斐波那契數列為[1 1 2 3 5 8 13 21]

#k = 7時,fibonacci(k-1)的值為13

#因此第乙個mid=14,14表示查詢資料的位置

mid = left +fibonacci(k-1)

if key < ilist[mid]

: right = mid-

1 k -=

1elif key > ilist[mid]

: left = mid+

1 k -=

2else

:return mid

##################################

if(key == ilist[right]):

return right

elif

(key == ilist[left]):

return left

else

:return-1

if __name__ ==

"__main__"

: ilist = quicksort(randomlist(20)

)print

(ilist)

keys=

[random.choice(ilist)

,random.randrange(

min(ilist)

,max

(ilist))]

for key in keys:

num = fibonaccisearch(ilist,key)

if(num>=0)

:print

("%d number is %d\n"

%(key,num)

)else

:print

("%d the key number is not find\n"

%key)

#print(timeit.timeit("fibonaccisearch(ilist,key)","from __main__ import selectsort,ilist",number=100))

斐波那契查詢

斐波那契查詢 斐波那契查詢的核心是 1 當key a mid 時,查詢成功 2 當key 3 當key a mid 時,新的查詢範圍是第mid 1個到第high個,此時範圍個數為f k 2 1個,即陣列右邊的長度,所以要在 f k 2 1 範圍內查詢。與二分查詢相比,斐波那契查詢演算法 的明顯優點在...

斐波那契查詢

與二分查詢相比,斐波那契查詢演算法的明顯優點在於它只涉及加法和減法運算,而不用除法。因為除法比加減法要占去更多的機時,因此,斐波那契查詢的平均效能要比折半查詢好。斐波那契查詢與折半查詢的時間複雜度間同為o log2 log2n 平均 情況下,斐波那契查詢優於折半查詢,但最壞情況下則差於折半查詢。斐波...

斐波那契查詢

基於二分法 此演算法依靠斐波那契數列 來跳轉比較位置 在玩數字板所以有了手寫圖 單步驟原理如下 c語言實現 include include define return fail 1 斐波那契查詢 int fibonaccisearch int src int,int src len,int sear...