重新整理数据结构与算法—— 斐波那契二分查找法[十四]

前言

概念:

https://baike.baidu.com/item/斐波那契数列/99145?fr=aladdin

我的解释图:

重新整理数据结构与算法—— 斐波那契二分查找法[十四]_第1张图片

其实就是将我们的数组长度分为两个部门,前面一部分为:f[k-1] 后面一部分为f[k-2]

推导过程:假设数组长度为:f[k]-1。

那么f[k]-1=(f[k-1]-1)+(f[k-2]-1)+1

其中这个1就是中间节点:

那么中间节点就是:mid=low+f[k-1]-1;

正文

所以代码思路是这样子的:

static void Main(string[] args)
{
	int[] arr = new int[]{1,1,1,1,2,5,10,11,16,18,20,100 };
	int result=fibSearch(arr,5);
	Console.WriteLine(result);
	Console.ReadKey();
}

public static int[] fib()
{
	int[] f = new int[20];
	f[0] = 1;
	f[1] = 1;
	for (int i=2;i
/// 斐波查找
/// 
/// 
/// 
/// 
public static int fibSearch(int[] arr, int key)
{
	int low=0;
	int mid = 0;
	int height = arr.Length-1;
	int k = 0;
	int[] f = fib();
	while (height>f[k]-1)
	{
		k++;
	}
	int[] temp = new int[f[k]];
	//让其符合斐波那契长度
	Array.Copy(arr,temp,0);
	for (int i=height+1;i arr[mid])
		{
			//其中减二是后面有f[k-2]个元素
			low = mid + 1;
			k-=2;
		}
		else {
			return height >= mid ? mid : height;
		}
	}
	return -1;
}

总结

斐波那契其实就是一种特殊确定中点位置的过程。

你可能感兴趣的:(重新整理数据结构与算法—— 斐波那契二分查找法[十四])