斐波拉契搜索(费氏搜寻法)

 刚才搜这个算法。百度出的结果带红字的好少。。貌似很少人用?搜索出来的都是一本书上的内容,而且还用的原创标记。。。那本书上讲的感觉也不大清楚。所以我就来简单介绍一下这个算法的思路吧。

 其实也简单。这个搜索和二分搜索是一致的。如果要找的数比当前点大就向左移,小的话就向右移。但是和二分查找差别在于,它的指针改变长度是斐波拉契数列的长度


 现在来做个说明。

以下是一组数a。以下标为1开始

1 3 5 7 9 13 15 17 19 20

接下来是斐波拉契数列f

1 1 2 3  5 8 13

如果你想在第一组数列中找5这个数。假设你一开始下标处于0,那么你第一次移动的长度就是斐波拉契数列中的第五个数也就是5.

然后取a[5],发现它比要找的数大,所以再用斐波拉契数列中第四个元素的大小来移动游标。也就是3.所以下个要比较的数就是a[5-3]==a[2].

然后发现又比5要小,所以向右找。同理直到找到与5相同的位置。


用这个算法其实有前提条件:查找的数必须是有序的。(并且查找的数一定要小于被搜索数组的长度?)

所以这个应用范围就很小了。。而且貌似还不像二分可以用来移动浮点数长度。

但是这个算法的速度显然是大于二分的。

以我个人直观的来看斐波拉契数列每一个数几乎是前一个数的一倍。

略少于一倍,所以相比二分查找来说,它的查找位置总是比上一次查找的位置更远一点。

二分查找永远是在中间,但是假如斐波拉契向右变化的话,那么比中间值靠右一点。变化更猛,收敛也就更快。

当然这是我直观的证明,相比严谨的数学证明,直观上的证明更容易理解些吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值