斐波那契查找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)。

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