斐波那契查找C++

#include<bits/stdc++.h>

using namespace std;

int Fibonacci(int n)
{
	int f = 0, g = 1;
	while (n--)
	{
		g += f;
		f = g - f;
	}
	return f;
}
int FibonacciSearch(int* a, int n, int key)
{
	int low = 1, high = n, mid, i, k = 0;
	while (n > Fibonacci(k) - 1)k++;
	for (i = n; i < Fibonacci(k) - 1; i++)a[i] = a[n];
	while (low <= high)
	{
		mid = low + Fibonacci(k - 1) - 1;
		if (key < a[mid])
		{
			high = mid - 1;
			k -= 1;
		}
		else if (key > a[mid])
		{
			low = mid + 1;
			k -= 2;
		}
		else
		{
			if (mid <= n)return mid;
			else return n;
		}
	}
	return -1;
}
int main(void)
{
	int a[10] = { 2,3,7,8,9,12,14,16,17 }, key;
	cin >> key;
	int FibonacciResult = FibonacciSearch(a, sizeof(a)/sizeof(int), key);
	cout << FibonacciResult << endl;
}

思路:

斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记录的个数为某个斐波那契数小1,及n=F(k)-1;

开始将k值与第F(k-1)位置的记录进行比较(及mid=low+F(k-1)-1),比较结果也分为三种

1)相等,mid位置的元素即为所求

2)>,low=mid+1,k-=2;

说明:low=mid+1说明待查找的元素在[mid+1,high]范围内,k-=2 说明范围[mid+1,high]内的元素个数为n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1个,所以可以递归的应用斐波那契查找。

3)<,high=mid-1,k-=1。

说明:low=mid+1说明待查找的元素在[low,mid-1]范围内,k-=1 说明范围[low,mid-1]内的元素个数为F(k-1)-1个,所以可以递归 的应用斐波那契查找。
  时间复杂度O(logn)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章