1、基本介绍
2、应用实例
package search;
import java.util.Arrays;
// 有点不太懂
public class FibonacciSearch {
private static final int maxSize = 20;
public static void main(String[] args) {
int[] arr = {1,8,10,89,1000,1234};
int index = fibSearch(arr, 0, arr.length - 1, 89);
if (index != -1) {
System.out.println("查找成功!");
System.out.println("元素下标:" + index);
} else {
System.out.println("查找失败!");
}
}
private static int fibSearch(int[] arr, int left, int right, int searchValue) {
int k = 0; // 记录黄金分割值的下标
int F[] = fib(); // 获取到斐波那锲数列
/*
顺序表长度不一定刚好等于F[k] - 1,则需将原顺序表的长度增加到F[k] - 1,
所以让k的值进行自增,使得F[k-1]大于等于顺序表长度即可
*/
while (F[k] - 1 < right) {
k++;
}
/*
将新数组扩充产生的数值 0,用原数组最后一元素值进行填充
*/
int[] temp = Arrays.copyOf(arr, F[k]);
for (int i = right + 1; i < temp.length; i++) {
temp[i] = arr[right];
}
// 开始查找目标值
while (left <= right) {
int mid = left + F[k - 1] - 1;
if (arr[mid] > searchValue) {
left = mid - 1;
k--;
} else if (arr[mid] < searchValue) {
right = mid + 1;
k -= 2;
} else {
// 需确定返回哪一个下标
if (mid <= right) {
return mid;
} else {
return right;
}
}
}
return -1;
}
// 获得一个斐波那契数列
private static int[] fib() {
int[] F = new int[maxSize];
F[0] = 1;
F[1] = 1;
for (int i = 2; i < maxSize; i++) {
F[i] = F[i - 1] + F[i - 2];
}
return F;
}
}