斐波那契查找算法是一种利用黄金分割率改进的二分查找算法,利用斐波那契数组确定中间点和构造新的数组长度满足f[k],例如原组长为6,根据斐波那契数组则新组长为8,多余组长位补充最大值,满足 f[k] = f[k-1] + f[k-2] (n>=2),中间点下标为mid = low + f[k-1] -1 。
package com.example.datastructures.search;
import java.util.Arrays;
/**
* @author maoyouhua
* @version jdk21
*
* 斐波那契查找是一种利用黄金分割改进的二分查找算法 f[k] = f[k-1] + f[k-2] (n>=2)
*/
public class FibonacciSearch {
public static int fibonacciSearch(int[] arr, int key){
int low = 0;
int high = arr.length - 1;
int k = 0;
int mid = 0;
int[] f = getFibonacciArr();
while (high > f[k] - 1) {
k++;
}
int[] temp = Arrays.copyOf(arr,f[k]);
for (int i = high + 1; i < temp.length; i++) {
temp[i] = arr[high];
}
System.out.println(Arrays.toString(temp));
while (low <= high) {
mid = low + f[k-1] -1;
if (key < temp[mid]) {
high = mid - 1;
k--;
} else if (key > temp[mid]) {
low = mid + 1;
k -= 2;
} else {
if (mid <= high) {
return mid;
} else {
return high;
}
}
}
return -1;
}
/**
* 0 1 2 3 4 5 6 7 8 9 10 11
* [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
* @return
*/
public static int[] getFibonacciArr(){
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i-1] + arr[i-2];
}
System.out.println(Arrays.toString(arr));
return arr;
}
/**
* [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
* [1, 8, 10, 89, 1000, 1234, 1234, 1234]
* index :3
* @param args
*/
public static void main(String[] args) {
int[] arr = {1,8,10,89,1000,1234};
int index = fibonacciSearch(arr, 89);
System.out.println("index :" + index);
}
}