查找算法---(图解)斐波那契查找

本文详细介绍了斐波那契查找算法的工作原理及其在有序数组中的应用。斐波那契查找利用黄金分割比,通过调整查找范围实现高效查找,与二分查找相比,其在某些场景下更优。文章提供了算法实现的代码示例。

斐波那契查找算法

斐波那契查找原理与二分查找相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近。

黄金分割点

我们知道,斐波那契数列 F(k)={1,1,2,3,5,8,13,21…},(从第三个数开始,后边每一个数都是前两个数的和)。
F[k] = F[k-1] + F[k-2]
恰巧斐波那契数列前一项/后一项的值越来越接近黄金比例,即0.618。

前提要求

  1. 待查找表为有序表。这点毋庸置疑。
  2. 它要求开始表中记录的个数为某个斐波那契数小1,即n=F(k)-1。

    为什么要求n=F(k)-1
    假如待查找数组长度为F(k),
    不考虑mid的情况下,左边为F(k - 1),右边为F(k -2),
    考虑mid的情况下,要不左边是F(k-1) - 1或者右边是F(k - 2) - 1 ,逻辑不好写。

    但顺序表长度n不一定刚好等于F[k]-1,所以需要将原来的顺序表长度n增加至F[k]-1
    这里的k值只要能使得F[k]-1恰好大于或等于n即可

基本思路

斐波那契查找关键就在要找到mid的位置。
在n=F(k)-1情况下,mid = low + F[k-1] - 1,我们就得到了mid的位置

但顺序表长度n不一定刚好等于F[k]-1,所以需要将原来的顺序表长度n增加至F[k]-1
这里的k值只要能使得F[k]-1恰好大于或等于n即可


可能有人要问mid = low + F[k-1] - 1怎么来的?
接下来我们图解一下:
在这里插入图片描述

接下来 将带查找值key与mid的值比较:
1.<    high=mid-1,k-=1;
   说明:low=mid+1说明待查找的元素在[low,mid-1]范围内,k-=1 说明范围[low,mid-1]内的元素个数为F(k-1)-1个,所以可以递归的应用斐波那契查找。

2.相等   mid位置的元素即为所求。

3. >     low=mid+1,k-=2;
   说明:low=mid+1说明待查找的元素在[mid+1,hign]范围内,k-=2 说明范围[mid+1,high]内的元素个数为n-(F(k-1))= Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1个,所以可以递归的应用斐波那契查找。

代码

public class FibSearch {
   
   
    public static int maxSize = 20; //假定斐波那契数列大小为20

    public static void main(String[] args) {
   
   
        int[] arr = {
   
   1, 
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值