重新整理数据结构与算法—— 斐波那契二分查找法[十四]
前言
概念:
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;
}
总结
斐波那契其实就是一种特殊确定中点位置的过程。