对于斐波那契查找算法的学习,建议根据程序代码,找一组数据一步步测试一下,会比较容易加深理解。
斐波那契查找算法类似于折半查找算法(二分查找算法)
对于折半查找:其 mid 处于 low 和 high 的中间。
而斐波那契查找算法,其 mid 处于 low 和 high 的黄金分割点处。
/斐波那契数列,越往后其前一数值与后一数值的比值会越来越接近于0.618/
#include <iostream>
using namespace std;
const int MAXSIZE = 20;
/*此函数定义了一个斐波那契数列*/
int Fbi(int i)
{
if(i < 2)
return (i = 0) ? 0 : 1;
return Fbi(i-1) + Fbi(i-2);
}
/*斐波那契查找算法,三个参数:所要查找的数列a[],所要查找的数据key,该数列数据元素的个数n*/
int Fbi_search(int * a,int key,int n)
{
int mid,low,high; /*三个数据,代表下标,类似于折半查找思路*/
int k,i;
low = 0; /*一开始,low放在最低位*/
high = n; /*high放在最高位*/
k = 0;
while(n > Fbi(k) - 1) /*注意这里是用于判断数据元素个数值n在斐波那契数列数的位置*/
k++; /*此处找出的k的值,有助于找出初始mid应该在的位置*/
for(i = n; i < Fbi(k) - 1; i++) /*补全数组,防止所要查找的数据是最高位数据时,出现数组越界的情况*/
a[i] = a[n];
while (low <= high) /*类似于折半查找*/
{
mid = low + Fbi(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 -1;
}
int main()
{
int a[MAXSIZE] = {0,1,16,24,35,47,59,62,73,88,99};
int n,key,index;
/*int test;*/
n = 10;
/*
test = sizeof(a)/sizeof(int) - 1,这里需要注意MAXSIZE,a的数据元素个数是20,所以不能这样用;
cout << test << endl;
*/
cout << "请输入所要查找的数: ";
cin >> key;
index = Fbi_search(a,key,n);
if(index != -1)
cout << "你所要查找的数所在位置: " << index << endl;
else
cout << "未找到你所要查找的数" << endl;
return 0;
}
/点滴积累,我的一小步 O(∩_∩)O~/