斐波拉契搜索(費氏搜尋法)

 剛纔搜這個算法。百度出的結果帶紅字的好少。。貌似很少人用?搜索出來的都是一本書上的內容,而且還用的原創標記。。。那本書上講的感覺也不大清楚。所以我就來簡單介紹一下這個算法的思路吧。

 其實也簡單。這個搜索和二分搜索是一致的。如果要找的數比當前點大就向左移,小的話就向右移。但是和二分查找差別在於,它的指針改變長度是斐波拉契數列的長度


 現在來做個說明。

以下是一組數a。以下標爲1開始

1 3 5 7 9 13 15 17 19 20

接下來是斐波拉契數列f

1 1 2 3  5 8 13

如果你想在第一組數列中找5這個數。假設你一開始下標處於0,那麼你第一次移動的長度就是斐波拉契數列中的第五個數也就是5.

然後取a[5],發現它比要找的數大,所以再用斐波拉契數列中第四個元素的大小來移動遊標。也就是3.所以下個要比較的數就是a[5-3]==a[2].

然後發現又比5要小,所以向右找。同理直到找到與5相同的位置。


用這個算法其實有前提條件:查找的數必須是有序的。(並且查找的數一定要小於被搜索數組的長度?)

所以這個應用範圍就很小了。。而且貌似還不像二分可以用來移動浮點數長度。

但是這個算法的速度顯然是大於二分的。

以我個人直觀的來看斐波拉契數列每一個數幾乎是前一個數的一倍。

略少於一倍,所以相比二分查找來說,它的查找位置總是比上一次查找的位置更遠一點。

二分查找永遠是在中間,但是假如斐波拉契向右變化的話,那麼比中間值靠右一點。變化更猛,收斂也就更快。

當然這是我直觀的證明,相比嚴謹的數學證明,直觀上的證明更容易理解些吧。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章