斐波那契查找算法

斐波那契查找算法

斐波那契查找与二分查找差不多,区别在于 二分查找的mid 使用除法算出来,而斐波那契查找的mid是用加减法算出来的,计算机对于 加减法的处理速度快于除法,尤其是在大数据量以及单个数值很大时尤其明显。

待排数组元素个数一定要是斐波那契数,如果不是我们就强行加长数组,多的空间用原待排数组的最后一个元素填充。

在这里插入图片描述

    /*
    使用fibonacci查找算法的目的:
        Fibonacci查找算法其实本质上就是二分查找算法
        只不过二分查找算法求mid时,用的是除法
        而Fibonacci查找算法用的是加减法,
        计算机处理加减法肯定比处理除法要快得多
     */

    /*
    实现原理:
        1、待查询数组的元素个数一定是fibonacci数,
        如果不是的话,那就把数组加长,剩余的空间用待查询数组的最后一个元素一并填充

        2、mid = low + f[k-1] - 1
        这个公式就可以找到加长数组的中间值

     */

    public static int[] findFibonacci(){

        int[] f= new int[20];
        f[0]=f[1]=1;

        for (int i=2;i<20;i++){
            f[i]=f[i-1]+f[i-2];
        }

        return f;

    }

    public static int fibonacci(int[] arr,int findVal){

        int low = 0;
        int hight = arr.length - 1 ;
        int[] fibonacciArray = findFibonacci();

        int k =0;
        // 一定要使待查询的数组元素个数一定是fibonacci数
        while (hight > fibonacciArray[k]-1)
        {
            k++;
        }


        int[] temp = Arrays.copyOf(arr,fibonacciArray[k]);

        //填充多余的空间
        for (int i =hight +1;i<temp.length;i++){
            temp[i]=arr[hight];
        }


        int mid;

        while(low <= hight){

            mid = low + fibonacciArray[k-1] -1;

            if (temp[mid]>findVal){
                hight = mid -1;
                k=k-1;
            }else if (temp[mid]<findVal){
                low = mid +1;
                k=k-2;
            }else {
                if (mid > arr.length-1){
                    return arr.length-1;
                }else{
                    return mid;
                }
            }

        }
        return -1;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值