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

前言

概念:

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

我的解释图:

其实就是将我们的数组长度分为两个部门,前面一部分为: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<f.Length;i++)
	{
		f[i] = f[i - 1] + f[i - 2];
	}
	return f;
}
/// <summary>
/// 斐波查找
/// </summary>
/// <param name="arr"></param>
/// <param name="key"></param>
/// <returns></returns>
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<temp.Length;i++)
	{
		temp[i] = arr[height];
	}
	while (low<=height)
	{
		mid = low + f[k - 1] - 1;
		if (key < arr[mid])
		{
			height = mid - 1;
			//其中减一是前面有f[k-1]个元素
			k--;
		}
		else if (key > arr[mid])
		{
			//其中减二是后面有f[k-2]个元素
			low = mid + 1;
			k-=2;
		}
		else {
			return height >= mid ? mid : height;
		}
	}
	return -1;
}

总结

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

posted @ 2020-06-30 11:08  敖毛毛  阅读(172)  评论(0编辑  收藏  举报