斐波那契查找

来源:互联网 发布:淘宝店铺被恶意举报 编辑:程序博客网 时间:2024/05/17 06:22

这是一种基于有序的查找方法,所用到的是斐波那契数列,它是利用黄金分割原理,从而提高查找的效率,下面主要介绍这个算法的过程以及算法的核心思想。

首先什么是斐波那契数组:

  0   1   2   3   4   5    6    7     8        9 

0112358132134

为了便于理解我们首先看看这一方法的算法实现:

int Fibonacci——search(int *a,int n,int key){    int low,high,mid,i,k;    low=1;    high=n;    k=0;while(n>F[k])-1)    k++;    for(i=n;i<F[k]-1,i++)    a[i]=a[n];    while(low<=high)          {              mid=low+F[k-1]-1;              if(key<a[mid])                   {                             high=mid-1;                              k=k-1;                    }               else if (key>a[mid])                    {                              low=mid+1;                              k=k-2;                     }                else                    {                        if(mid<=n)                           return mid;                        else                           return n;                     }            }   return 0;}
其中a是要查找的对象,key是要查找的关键字,我们假a={0,1,16,24,35,47,59,62,73,88,99},可以n=10。

下面介绍上面的代码的原理:

1).

  k=0;while(n>F[k])-1)    k++;  计算出n位于斐波那契数列中的位置,可以得到k=7。
2).
<pre name="code" class="cpp">    for(i=n;i<F[k]-1,i++)    a[i]=a[n]                       这两句话是说明对于斐波那契数列来说F[7]=13,所以需要a中有13个数,而原来的只有10个数需要加上两个,并且赋值为最大值即a【10】。
3).
<pre name="code" class="cpp"> mid=low+F[k-1]-1;                说明我们首先从8开始。a【8】=73,而key是59。
4).
<pre name="code" class="cpp"> if(key<a[mid])                   {                             high=mid-1;                              k=k-1;
} 由于key小于a【mid】,所以执行这几行语句, 得到k=6,high=7.

5).
再次循环,mid=5,a【mid】=47<key,执行以下程序:
<pre name="code" class="cpp">else if (key>a[mid])                    {                              low=mid+1;                              k=k-2;                     }                       low=6,k=4.注意k下调两个位置。
6).
再次循环mid=7,a【mid】>key,执行
<pre name="code" class="cpp"><pre name="code" class="cpp">f(key<a[mid])                   {                             high=mid-1;                              k=k-1;
} high=6,k=3.得到相等输出6.
从以上的代码分析来看,斐波那契的核心思想就是:1) 当key=a【mid】时,查找成功。
2) 当key《a【mid】时,新范围是第low个到第low-1个,此时范围个数为F【k-1】-1个
3) 当key》a【mid】时,新范围是第m+1个到第high个,此时范围个数是F【k-2】-1个。

0 0