首页 > 编程语言 > 详细

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

时间:2020-06-30 12:48:44      阅读:66      评论:0      收藏:0      [点我收藏+]

前言

概念:

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;
}

总结

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

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

原文:https://www.cnblogs.com/aoximin/p/13210663.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!