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;}