java查找算法:斐波那契查找

1.斐波那契查找简述:

斐波那契查找(Fibonacci Search)也是有序表的一种查找方式,同样属于二分查找的一个优化,它是利用了黄金分割原理(斐波那契数列)来实现的。改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即mid=left+F(fibIndex-1)-1(F代表斐波那契数列)。

2.斐波那契数列:

即1,1,2,3,5,8,13…,从第三个数开始,后面的数都等于前两个数之和,而斐波那契查找就是利用的斐波那契数列来实现查找的。初始化的斐波那契数列最后一位要大于等于数组元素的size-1。

3.斐波那契查找步骤

  1. 如果与给定关键字相同,则查找成功,返回mid和right的最小值;
  2. 如果给定关键字大,向右查找并减小2个斐波那契区间;
  3. 如果给定关键字小,向左查找并减小1个斐波那契区间;
  4. 重复过程,直到找到关键字(成功)或区间为空集(失败)。

4.java代码实现

public class FibonacciSearch {
 public static void main(String[] args) {
int arr[]={1,2,3,4,5,6,7,8,89};
        int index= fibonacciSearch(arr,10);
        System.out.println("index "+index);
    }
}
//获取斐波那契函数数组
//maxsize 数组的长度
public int [] Fibonacci(int maxsize){
int fibonacci[]=new int [maxsize];
fibonacci[0]=1;
fibonacci[1]=1;
for(int i=2;i>fibonacci.length;i++){
fibonacci[i]=fibonacci[i-1]+fibonacci[i-2];
}
return fibonacci;
}
public static int fibonacciSearch(int []arr,int Value){
//左边索引
int left=0;
//右边索引
int right=arr.length-1;
//存放中间下标
int mid=0;
//表示fibonacci数组的下标
int fibIndex=0;
//获取斐波那契函数
int fibonacci[]=Fibonacci(10);
//获取斐波那契函分割数值的下标
while(right> fibonacci[fibIndex]){
fibIndex++;
}
//因为斐波那契数组的fibonacci[fibIndex]值可能大于arr数组的长度,,因此我们要使用Arrays类,
//构造一个新的数组,并指向arr[]
//不足得部分会使用0填充
int temp[]=Arrays.copyOf(arr,fibonacci[fibIndex]);
//实际上需求用arr最后的值来进行补充 
for(int i=right+1;i<fibonacci[fibIndex];i++){
temp[i]=arr[right];
}
//使用while循环,找到我们的数Value
//只要这个条件满足 ,就可以找
while(left<right){
//中间下标
mid=left+fibonacci[fibIndex-1]-1;
if(Value>temp[mid]){
//要找的值大于中间值说明在数组的右边
//fibonacci[fibIndex]=fibonacci[fibIndex-1]+fibonacci[fibIndex-2];
//fibonacci[fibIndex-1] 为数组左边的值 fibonacci[fibIndex-2]为数组右边的值
left=mid+1;
fibIndex-=2;
}else if(Value<temp[mid]){
//要找的数小于中间值,说明在数组的左边 fibIndex--;
right=mid-1;
fibIndex--;
}else{
//注意:这里要进行判断返回时是哪个下标
//如果mid<right 如果mid>right,返回right;
if(mid<right){
return mid;
}else{
return right;
}
}
//如果没有找到则返回-1;
return -1;
}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little Chen1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值