斐波那契(黄金分割法)查找算法(java)

斐波那契(黄金分割法)原理:

斐波那契查找算法,也同样还是要求待查找序列是有序的

斐波那契查找原理和二分查找、插值查找的原理大致相同,仅仅是改变了中间节点(mid)的位置,mid不再是中间或者插值得到,而是位于黄金分割点附近,即

mid = low + F(k - 1) - 1  //其中F代表的是斐波那契数列 

首先需要得到一个斐波那契数列,,再在这个基础上,编写斐波那契查找算法

//斐波那契数列
    public static int[] fib() {
        int[] f = new int[maxSize];
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i < f.length - 1; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        return f;
    }

因为枢轴mid是根据斐波那契F(k - 1)决定的,所以得构造一个长度为 f[k] 的新数组;

public static int fibSearch(int[] a,int key) {
        int low = 0;
        int high = a.length - 1;
        int k = 0;  //表示斐波那契分割数值的下标
        int mid = 0;
        int f[] = fib(); //获取斐波那契数列
        //获取斐波那契分割数值的下标
        while (high > f[k] - 1) {
            k++;
        }

        int[] temp = Arrays.copyOf(a,f[k]);
        //为了保证新构造的数组序列是有序的,则需要使用a数组最后的数填充temp
        for (int i = high + 1; i < temp.length; i++) {
            temp[i] = a[high];
        }

        //使用while循环处理,找到数key
        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 -= 2;
            }
            else {  //找到
                //需要确定,返回的是哪个下标
                if (mid <= high) {
                    return mid;
                }
                else {
                    return high;
                }
            }
        }
        return -1;
    }

在这里插入图片描述

整个序列的长度是 F[k] - 1,由于需要满足递归,的规律,而且根据斐波那契数列的特点 F[k] = F[k - 1] + F[k - 2],所以就把 mid 的左边分成了 F[k - 1] - 1个数,mid 的右边分成了 F[k - 2] - 1个数,如上图所示,所以在while循环中,往左递归是k–,往右递归是k -= 2;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值