說明
二分搜尋法每次搜尋時,都會將搜尋區間分為一半,所以其搜尋時間為
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年代的歐洲數學家,在他的著作中曾經提到 若有乙隻免子每個月生乙隻小免子,乙個月後小免子也開始生產。起初只有乙隻免子,乙個月後就有兩隻免子,二個月後有三隻免子,三個月後有五隻免子 小免子投入生產 如果不太理解這個例子的話,舉個圖就知道了,注意新生的小免子需乙個月成長期才會投...