斐波那契算法的理解

1.斐波那契数列 :

数组:int[] F={1, 1, 2, 3, 5, 8, 13, 21, 34, 55 };

特点:

从第三个数开始,后边每一个数都是前两个数的和 。F[k]=F[k-1]+F[k-2];

如图所示:

        ①low、mid、high都是F数组的索引,F[k]-1表示长度。

        ②为了方便计算出mid,变形:F[k]-1 = (F[k-1]-1) + (F[k-2]-1) + 1;(多出来的1,可以当作mid)

        ③high=(F[k]-1)-1;

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

2.需求:

        现在有一个数组int[] arr={1,8,10,89,1000,1234},长度n=6;

        需要定义一个方法,从arr数组中找到数值为80(key=80),

        若有,则返回索引,若没有,就返回-1。

分析:

①黄金分割点: 

        黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。

结论:

        只要顺序表的长度是F[k]-1,就可以分成两段:较大部分F[k-1]-1,和较小部分F[k-2]-1。

③黄金分割点,是按照长度来划分,与索引有密切关系。

        一旦确定了数组arr的黄金分割点mid,之后就可以拿着我们要找的80与黄金分割点mid索引的元素值比较。再之后与二分查找类似。

④arr数组的长度n,是固定的值6,由于(F[k]-1)是不定的,最大值可以非常大,可看成无限大。

        所以总是会存在:(F[k]-1)的值刚好大于或等于长度6。

        arr数组的长度n确定了,那么(F[k]-1)的值也就确定了。

因此只要arr数组中元素个数n能达到此时的(F[k]-1),就可以把arr数组分成两段,从而确定黄金分割点。

⑤新建一个数组brr,长度为(F[k]-1)。然后把arr这个数组中的数据全都拷贝到brr数组中,不足的部分先用0补充,最后把0换成arr的最后一个元素来补充(即arr[high])。

拿着key=80,与brr[mid]比较,

若key大,就把黄金分割点及右侧的部分都删除。

若key小,就把黄金分割点及左侧的部分都删除。

然后产生新的黄金分割点,再比较,直至两者相等,

若最终一直没找到,low>high就停止寻找。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值