斐波那契查找(Java)
斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为Fn,完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。
重要公式:mid=low+F[k-1]-1
适用条件: 采用顺序存储结构的有序表
理解:mid在黄金分割点附近,
F(k-1)-1:是由斐波那契数列的“F[k]=F[k-1]+F[k-2]”,F[k]-1=(F[k-1]-1)+(F[k-2]-1)+1,则若顺序表的长度为:F[k]-1,则可分成F[k-1]-1和F[k-2]-1两段,中间位置就为:mid=low+F[k-1]-1
代码如下
import java.util.Arrays;
public class Fibonaccisearch {
public static int maxsize=20;
public static void main(String[] args) {
int arr[]= {2,3,5,7,9,11};
int Index=fibonaccisearch(arr,5);
if(Index==-1) {
System.out.println("没有该元素");
}else {
System.out.println("斐波那契查找,该元素的下标为:"+Index);
}
}
public static int fibonacci(int i){
if(i==0||i==1) {
return i;
}else {
return fibonacci(i-1)+fibonacci(i-2);
}
}
public static int fibonaccisearch(int []arr,int key) {
int low=0;
int high=arr.length-1;
int k=0;
int mid=0;
int []f=new int[maxsize];
for(int i=0;i<f.length;i++) {
f[i]=fibonacci(i);
}
while(high>f[k]-1) {//获得斐波那契分割点
k++;
}
int[]temp=Arrays.copyOf(arr, f[k]);
for(int j=high+1;j<temp.length;j++) {
temp[j]=arr[high];
}
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=k-2;
}else {
if(mid<=high) {
return mid;
}else {
return high;
}
}
}
return -1;
}
}
运行结果
斐波那契查找,该元素的下标为:2