費氏搜尋法

2021-08-27 12:44:14 字數 2253 閱讀 5591

說明

二分搜尋法每次搜尋時,都會將搜尋區間分為一半,所以其搜尋時間為

o(log(2)n)

,log(2)表示

以2為底的log

值,這邊要介紹的費氏搜尋,其利用費氏數列作為間隔來搜尋下乙個數,所以區

間收斂的速度更快,搜尋時間為

o(logn)。

解法

費氏搜尋使用費氏數列來決定下乙個數的搜尋位置,所以必須先製作費氏數列,這在之前有提

過;費氏搜尋會先透過公式計算求出第乙個要搜尋數的位置,以及其代

表的費氏數,以搜尋對 象

10個數字來說,第乙個費氏數經計算後一定是

f5,而第乙個要搜尋的位置有兩個可能,例如

若在下面的數列搜尋的話(為了計算方便,

通常會將索引

0訂作無限小的數,而數列由索引1開

始):-infin; 1 3 5 7 9 13 15 17 19 20

如果要搜尋

5的話,則由索引

f5 = 5

開始搜尋,接下來如果數列中的數小於指定搜尋值時,就往

左找,大於時就向右,每次找的間隔是f4、

f3、f2來尋找,當費氏數為

0時還沒找到,就表示

尋找失敗,如下所示:

由於第乙個搜尋值索引

f5 = 5

處的值小於

19,所以此時必須對齊數列右方,也就是將第乙個搜

尋值的索引改為

f5+2 = 7

,然後如同上述的方式進行搜尋,如下所示:

至於第乙個搜尋值是如何找到的?我們可以由以下這個公式來求得,其中

n為搜尋物件的個數: f

x+ m = nfx

<= n

也就是說

fx必須找到不大於

n的費氏數,以

10個搜尋物件來說: f

x+ m = 10取f

x= 8, m = 2

,所以我們可以對照費氏數列得

x = 6

,然而第乙個數的可能位置之一並不是f6,

而是第x-1的費氏數,也就是f5

= 5。

如果數列

number

在索引5

處的值小於指定的搜尋值,則第乙個搜尋位置就是索引

5的位置,如果

大於指定的搜尋值,則第乙個搜尋位置必須加上

m,也就是f5

+ m = 5 + 2 = 7

,也就是索引7的

位置,其實加上

m的原因,是為了要讓下乙個搜尋值剛好是數列的最後乙個位置。

費氏搜尋看來難懂,但只要掌握fx

+ m = n

這個公式,自己找幾個例項算一次,很容易就可以理

解;費氏搜尋除了收斂快速之外,由於其本身只會使用到加法與減法,在運算上也可以加快。

#include

#include

#define max 15

#define swap(x,y)

void createfib(void);//建立費氏數列

int findx(int, int);// 找x值

int fibsearch(int, int); // 費氏搜尋

int fib[max] = ;

int main(void)

;int i, find;

printf("數列:");

for(i = 0; i < max; i++)

printf("%d ", number[i]);

printf("\n輸入尋找物件:");

scanf("%d", &find);

if((i = fibsearch(number, find)) >= 0)

printf("找到數字索引 %d ", i);

else

printf("\n找不到指定數");

printf("\n");

return 0;

}// 建立費氏數列

void createfib(void)

// 找 x 值

int findx(int n, int find)

// 費式搜尋

int fibsearch(int number, int find)

return -1;

}//之上系列參考演算法大全

費氏查詢演算法

費氏查詢演算法,利用斐波那契數列的思想,逐步修改要查詢的區間,根據資料的範圍依據費氏樹的結構往下查詢資料,直到找到資料或達到費氏樹的底端位置。相對於折半查詢演算法來說,建立斐波那契數列不需要用除法。效率要高。在初始階段搜尋相對較快,但是在後半程收斂比較慢。在考慮是否可以將該方法和其他搜尋演算法融合一...

Fibonacci費氏數列

param args fibonacci為1200年代的歐洲數學家,在他的著作中曾經提到 若有乙隻免子每個月生乙隻小免子,乙個月後小免子也開始生產。起初只有乙隻免子,乙個月後就有兩隻免子,二個月後有三隻免子,三個月後有五隻免子 小免子投入生產 如果不太理解這個例子的話,舉個圖就知道了,注意新生的小免...

2 費氏數列

fibonacci為1200年代的歐洲數學家,在他的著作中曾經提到 若有乙隻免子每個月生乙隻小免子,乙個月後小免子也開始生產。起初只有乙隻免子,乙個月後就有兩隻免子,二個月後有三隻免子,三個月後有五隻免子 小免子投入生產 如果不太理解這個例子的話,舉個圖就知道了,注意新生的小免子需乙個月成長期才會投...