费氏搜寻法

您所在的位置:网站首页 费氏数列押注 费氏搜寻法

费氏搜寻法

2024-07-04 21:04| 来源: 网络整理| 查看: 265

说明

二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为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为搜寻对象的个数:

Fx + m = n

Fx = 0)         printf("找到数字索引 %d ", i);     else         printf("\n找不到指定数");     printf("\n");     return 0; } // 建立费氏数列 void createfib(void)     {     int i;     Fib[0] = 0;     Fib[1] = 1;     for(i = 2; i < MAX; i++)         Fib[i] = Fib[i-1] + Fib[i-2]; } // 找 x 值 int findx(int n, int find) {     int i = 0;     while(Fib[i] 0)     {         if(number[i] < find)             i += Fib[--x];         else if(number[i] > find)             i -= Fib[--x];         else             return i;     }     return -1; }

//之上系列参考算法大全



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3