1.有幸遇见
斐波那契查找算法,也称黄金分割查找算法,是一种基于斐波那契数列的查找算法。与二分查找类似,斐波那契查找也是一种有序查找算法,但它的查找点不是中间位置,而是根据斐波那契数列来确定,因此又称为黄金分割查找。
2.原理讲解
斐波那契(黄金分割法)原理:斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置, mid不再是中间或插值得到,而是位于黄金分割点附近,即mid=low+F(k-1)-1(F代表斐波那契数列)。
注:顺序表长度n不一定刚好等于F[K]-1,所以需要将原来的顺序表长度n增加至F[k]-1。
3.构建斐波那契数组
public static int[] fib() {
int[] f = new int[maxSize];
f[0] = 1;
f[1] = 1;
for (int i = 2; i < f.length; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f;
}
4.痛苦的过程
/**
* 斐波那契算法实现
* @param arr 目标数据
* @param value 目标数
* @return 目标数的下标
*/
public static int fibonacciSearch(int[] arr, int value) {
int left = 0;
int right = arr.length - 1;
int k = 0;//斐波那契分割数值的下标
int middle = 0;//中间值
int[] f = fib();//获取斐波那契数列
//获取斐波那契的下标
while (right > f[k] - 1) {
k++;
}
//拷贝斐波那契数组
int[] temp = Arrays.copyOf(arr, f[k]);
for (int i = right + 1; i < temp.length; i++) {
temp[i] = arr[right];
}
while (left < right) {//终止循环的条件
middle = left + f[k - 1] + 1;
if (value < temp[middle]) {//继续向数组的左边查找
right = middle - 1;
k--;
} else if (value > temp[middle]) {//继续向数组的右边查找
left = middle + 1;
k -= 2;
} else {//找到
if (middle < right) {
return middle;
} else {
return right;
}
}
}
return -1;
}