斐波那契查找算法
斐波那契查找与二分查找差不多,区别在于 二分查找的mid 使用除法算出来,而斐波那契查找的mid是用加减法算出来的,计算机对于 加减法的处理速度快于除法,尤其是在大数据量以及单个数值很大时尤其明显。
待排数组元素个数一定要是斐波那契数,如果不是我们就强行加长数组,多的空间用原待排数组的最后一个元素填充。
/*
使用fibonacci查找算法的目的:
Fibonacci查找算法其实本质上就是二分查找算法
只不过二分查找算法求mid时,用的是除法
而Fibonacci查找算法用的是加减法,
计算机处理加减法肯定比处理除法要快得多
*/
/*
实现原理:
1、待查询数组的元素个数一定是fibonacci数,
如果不是的话,那就把数组加长,剩余的空间用待查询数组的最后一个元素一并填充
2、mid = low + f[k-1] - 1
这个公式就可以找到加长数组的中间值
*/
public static int[] findFibonacci(){
int[] f= new int[20];
f[0]=f[1]=1;
for (int i=2;i<20;i++){
f[i]=f[i-1]+f[i-2];
}
return f;
}
public static int fibonacci(int[] arr,int findVal){
int low = 0;
int hight = arr.length - 1 ;
int[] fibonacciArray = findFibonacci();
int k =0;
// 一定要使待查询的数组元素个数一定是fibonacci数
while (hight > fibonacciArray[k]-1)
{
k++;
}
int[] temp = Arrays.copyOf(arr,fibonacciArray[k]);
//填充多余的空间
for (int i =hight +1;i<temp.length;i++){
temp[i]=arr[hight];
}
int mid;
while(low <= hight){
mid = low + fibonacciArray[k-1] -1;
if (temp[mid]>findVal){
hight = mid -1;
k=k-1;
}else if (temp[mid]<findVal){
low = mid +1;
k=k-2;
}else {
if (mid > arr.length-1){
return arr.length-1;
}else{
return mid;
}
}
}
return -1;
}