f[k]-1 = f[k-1]-1 + f[k-2] - 1 +1 这个公式的由来 因为我们要找到分割的点, 用-1 我们可以将 整体分成三段了。 我们要用的是数据的长度。 也就是要 f[k-1]
但是我们mid 的取值其实是下标。所以是 f[k-1] -1;
先创建了 f[k]这么个数列,然后要让,数组的长度 = f[k]-1这样我们才能分割
这次并没有用递归。用的是while循环。让sta 或者是end 其中一个做加 或者减,最终退出。
package a;
import java.util.Arrays;
public class FibonacciSearch {
static int max = 18;
public static void main(String[] args) {
int[] arr = {3, 5, 7, 16, 17, 18, 66, 88, 128};
int [] fio = fiboarr();
int value = 1288;
int index = fibo(arr, value);
System.out.println("index = " + index);
if(index!=-1)
System.out.println("arr[index] = " + arr[index]);
}
private static int fibo(int[] arr, int value) {
int sta = 0;
int end = arr.length-1;
// System.out.println(end+1);
int k = 0;
int mid = 0;
int []fiboarr = fiboarr();
while (end > fiboarr[k]-2) {//因为这的end是下标
k++;
}//结束之后我们找到了数组应该的长度。
int[] temp = Arrays.copyOf(arr, fiboarr[k] - 1);
for (int i = arr.length; i < temp.length; i++) {
temp[i] = arr[end];//将数组的最后的值都赋值为旧数据的最大值
}
while (sta <=end) {
mid=sta+fiboarr[k-1]-1;
if (temp[mid] >value) {
end = mid-1;
k--;
} else if (temp[mid] < value) {
sta = mid+1;
k-=2;
}else {
if (mid <= end) {//因为新建的数组下标是超过旧的 ,所以如果在超出的位置找到。用最后一个。
return mid;
}else {
return end;
}
}
}
return -1;
}
private static int[] fiboarr() {
int [] fibo = new int[max];
fibo[0]=1;
fibo[1]=1;
for (int i = 2; i < fibo.length; i++) {
fibo[i] = fibo[i-1]+fibo[i-2];
}
return fibo;
}
}