斐波那契查詢(Fibonacci Search)

2021-09-30 06:15:45 字數 3429 閱讀 5091

1fibonacci數列

「有小兔一對,若等二月它們成年,第三月生下一對小兔,以後每月生產一對小兔,而所生小兔亦在第二月成年,第三月生產另一對小兔,以後亦每月生產小兔一對。假定每生產一對小兔,必為一雌一雄,且均無死亡,試問一年後共有小兔幾對?

分析:首先觀察一下頭七個月的情況,為此引入下述記號,用

表示原來的一對小兔,(=1

,2……12

)表示第

個月生的一對小兔子,

表示第對小兔子兩個月以後又生的第

對小兔子,依次類推如表。 月份

對數 1 1

2 1

3 2

4 3

5 5

6 8

7 13

從表中可知七月份共有兔子

13對;還可看出,從三月份開始,每月的兔子總數恰好等於它前面兩個月的兔子總數之和。按這規律可寫出數列1、

1、2、

3、5、

8、13、

21、34、

55、89、

144可見一年後共有兔子

144對。我們這道題運用的是初等數學的歸那法,通過對問題的分析列表並計算得出結論。

這是乙個有限數列,按上述規律寫出無限數列就叫做

fibonacci

數列(這是為了紀念兔子繁殖問題的創始人義大利數學家裴波那契),其中的每一項叫做

fibonacci

數。若令

此數列有下面的遞推關係: ,

與fibonacci

數列緊密相關的乙個重要極限是

,這恰好是**分割比。除了與**分割有聯絡外,

fibonacci

數列還出現在為數眾多的領域,如某些葉子的排列,某些花的花瓣數,另外蜜蜂的家譜、鋼琴音階的排列也有該數列的特點。

2fibonacci二叉樹的形成

1.以資料個數

n來決定

fibonacci為k

階(k-order)

j=0 fib(0)=0

j=1 fib(1)=1

j=2 fib(2)=1

j=3 fib(3)=2

j=4 fib(4)=3

…… j=nfib(n)= fib(n-1)+fib(n-2)

設計一最小的

k值,使得

fib(k+1)>n+1 2

.k=0

或k=1

則表示fibonacci

只有乙個結點,其餘別無它物。 3

.k>=2

,則表示

fibonacci

的根為fib(k)

,左子樹為(

k-1)階

fibonacci

樹(其根為

fib(k-1)

,右子樹為(

k-2)階

fibonacci

樹(其根為

fib(k)+fib(k-2)

),上面的演算法適用於

n+1值為

fibonacci

樹,若n+1

不為fibonacci

樹,則找出m使得

fib(k),再依上述演算法建立

fibonacci

樹,最後把

fibonacci

樹的各結點資料減去

m,就可以了。

3fibonacci差值原則(1

)左子樹為負,右子樹為正。 (

2)如圖所示:

步驟:假設資料個數有n個

且n比某一fibonacci

數小,滿足下列的表示式,如下所示:

fa>=n+1 則

fa-1

就是這棵

fibonacci

樹的樹根,而

fa-3

則是開始的差值。如果我們要查詢乙個值

key。首先我們比較陣列索引和

key,而得到下列的三種情況,如下所示: 1.

當key

比較小,則我們查詢1到

fa-1-1

的資料。 2.

當key

比較大,則我們查詢

fa-1+1

到fa-1

的資料。 3.

當key

與陣列索引

fa-1

的值相等,表示查詢成功。 4.

繼續上述的步驟直到找到鍵值或

fibonacci

樹的差值為零。

c語言程式

fib=

intfib_search(int n,int key) }

else

if(key>data[mid-1].key)

if(fn1<=1)

mid=0;

else

else

return--mid; }

return

-1; }

例:利用斐波那契查詢法查詢某一數值資料

原始資料:

3416

27975428295

排序後的資料:

d[1]d[2] d[3] d[4] d[5] d[6] d[7]d[8]

916273442758295

利用演算法規則,生成斐波那契樹,如圖所示:

比如要查詢

key=34,

此時從樹根開始比較:

(1)當key>

樹根時,往右子樹根開始比較;

(2)當key<

樹根時,往左子樹根開始比較;

(3)當key=

樹根時,表示資料找到。

過程如下:

(1)key=34<82,

往左子樹查詢

->

第一次;

(2)key=34<42,

往左子樹查詢

->

第二次;

(3)key=34>27,

往右子樹查詢

->

第三次;

(4)key=34

,資料找到

->

第四次。

共查詢四次

效率:斐波那契查詢與折半查詢的時間複雜度間同為o(

log2(log2n)),

平均情況下,斐波那契查詢優於折半查詢,但最壞情況下則差於折半查詢。斐波那契查詢優點是只有加、減運算。折半查詢有除法運算。缺點是每次必須計算下個級數。

斐波那契 Fibonacci 數列

實踐證明,尾遞迴 確實比普通遞迴效率高。下面的例子 用 普通遞迴需要10s完成 而用尾遞迴,只用了1s不到 package com.zf.dg 題目 有一種母牛,出生後第三年,開始生育,每年都生一頭 母牛 貌似單性生育,這裡就沒公牛什麼事兒 生出來的小母牛也符合同樣的規律,出生後第三年,開始生 育,...

Fibonacci 斐波那契數列

一 介紹 在數學上,費波那契數列是以遞迴的方法來定義 0 f 0 1 f 1 f f f f f n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis中...

斐波那契數列(Fibonacci)

斐波那契數列 無窮數列 1,1,2,3,5,8,13,21,34,55.稱為fibonacci數列。它可以定規地定義為 n 0,1 f n 1 n 1 f n f n 1 f n 2 這是乙個遞迴的關係式,它說明當n大於1時,這個數列的第n項的值,是它前面兩項的和,它用兩個較小的自變數的函式值來定義...