斐波那契查找(Java)

斐波那契查找(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值