斐波那契查找算法——深入理解,详细推导

斐波那契查找算法又称黄金分割查找算法。黄金分割点是把一条线段分成两个部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。

了解斐波那契查找算法就必须了解斐波那契数列,例如这样一组数列{1,1,2,3,5,8,13,21,34,55}。其中每项的值等于前两项之和,两个相邻数字的比列无线接近与0.618。

关于斐波那契算法,(以下截图来自韩顺平老师数据结构与算法的教学视频)链接
在这里插入图片描述
补充:理解mid = low + F(k - 1) - 1对于后面写程序至关重要,其中式子F[K] - 1 = (F[k - 1] - 1) + (F[k - 2] - 1) + 1;这里面‘1‘就代表mid。

(这段是重点:)
可以看到,斐波那契查找算法的思路就是把一个斐波那契数列映射到原需要查询的数列。通过将斐波那契数列中的每一项的值看成是一个数列中元素的个数,其中,斐波那契数列中的每一项减去1就代表原数列中的下标,因为原数列起始下标是从0开始的。关键是要理解斐波那契是如何对原数列进行划分的。它的划分规则就是借助于一个斐波那契数列。例如有一斐波那契数列{1,1,2,3,5,8,13},假设长度13是我们需要查询的原数列。根据斐波那契的规则:每项等于前两项之和,比如这里的13 = 8 + 5。然后根据这个规则映射到对原数组划分,则长度13的原数组划分为长度8,和5两个部分。所以对应的下标就是一部分{0到7}(这部分就是F[k - 1],其中的k表示斐波那契数列的下标),另一部分{8到12}(这一部分就是F[k - 2],k同前)。所以根据公式mid = low + F(k - 1) - 1,算出mid = 0 + 8 - 1 等于7,所以原查询数列下标为7是中间值,这也验证了上述的划分结果没有错误,接下来如果没有找到就需要在第一轮划分上接着划分,过程是一样的,都需要借助斐波那契数列。到此,相信读者已经明白了整个过程。(笔者自认为这一段讲述是非常清晰、成功的哈哈哈)。

还有一点需要注意:由于斐波那契数列中的每一项我们看成是一个数列的元素个数,而斐波那契数列中的每一项的值是固定了的,但它却不包含所有的值。所以我们需要将原需要查询的数列扩容到大小离斐波那契数列中最接近的那一个数。例如斐波那契数列中有13这么一个项,而我此时的数列长度只有12,所以需要将原数列扩容到13。至于扩容的过程,在代码中体会吧。到此为止,是不是特别清晰明了了?

最后给出完整的代码,细节就在代码中慢慢体会吧:

/**
     * 斐波那契查找算法非递归实现
     *
     * @param arr   待查询的数组
     * @param value 查询的值
     * @return 位置结果(下标)
     */

    public static int fibonacciSearch
  • 14
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值