package com.cjx.search;
import java.util.Arrays;
/**
* @author @@@
*/
public class FibonacciLookup {
static int maxSize = 20; //斐波那契数组的长度
public static void main(String[] args) {
int[] arr = {1, 2, 5, 7, 8, 12, 23, 45, 68, 78, 88, 95, 98,};
System.out.println(fibonacciLookup(arr, 1));
}
//定义一个方法,创建一个斐波那契数组
public static int[] fibonacciArray() {
int[] fibonacci = new int[maxSize];
fibonacci[0] = 0;
fibonacci[1] = 1;
for (int i = 2; i < maxSize; i++) {
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
}
return fibonacci;
}
//方法实现斐波那契查找
public static int fibonacciLookup(int[] arr, int findValue) {
int left = 0; //左索引
int right = arr.length - 1; //右索引
int k = 0; //斐波那契数组的索引
int mid = 0; //中间值的索引
int midValue = 0; //存放中间值
int[] fib = fibonacciArray(); //斐波那契数组
//首先要从斐波那契数组里面找一个数,这个数要大于arr的长度
// 小于等于才能确保fib[k]大于arr.length
while (fib[k] <= arr.length) {
k++;
}
//接下来将arr数组中的数据拷贝到一个新数组中,这个新数组的长度就是fib[k]
int[] temp = Arrays.copyOf(arr, fib[k]);
//有可能temp数组的长度要大于arr数组的长度,多余的空间默认填充0,
// 但是0也是数据,会影响找的过程,
// 所以就将默认填充的0改成arr数组的最后一个数据
for (int i = right + 1; i < temp.length; i++) {
temp[i] = arr[right];
}
//接下来使用while处理,找到findValue
while (left <= right) {
//先得到mid
mid = left + fib[k - 1] - 1; //先得到中间值的索引
midValue = temp[mid]; //得到中间值的大小
//接下来判断findValue是大于还是小于或是等于midValue
if (findValue < midValue) {
right = mid - 1;
k--;
} else if (findValue > midValue) {
left = mid + 1;
k -= 2;
} else {
if (mid <= right) {
return mid;
} else {
return right;
}
}
}
return -1;
}
}
由于数据少,可能有问题没发现,如果发现有什么错误,请多多指正。