刚才搜这个算法。百度出的结果带红字的好少。。貌似很少人用?搜索出来的都是一本书上的内容,而且还用的原创标记。。。那本书上讲的感觉也不大清楚。所以我就来简单介绍一下这个算法的思路吧。
其实也简单。这个搜索和二分搜索是一致的。如果要找的数比当前点大就向左移,小的话就向右移。但是和二分查找差别在于,它的指针改变长度是斐波拉契数列的长度。
现在来做个说明。
以下是一组数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相同的位置。
用这个算法其实有前提条件:查找的数必须是有序的。(并且查找的数一定要小于被搜索数组的长度?)
所以这个应用范围就很小了。。而且貌似还不像二分可以用来移动浮点数长度。
但是这个算法的速度显然是大于二分的。
以我个人直观的来看斐波拉契数列每一个数几乎是前一个数的一倍。
略少于一倍,所以相比二分查找来说,它的查找位置总是比上一次查找的位置更远一点。
二分查找永远是在中间,但是假如斐波拉契向右变化的话,那么比中间值靠右一点。变化更猛,收敛也就更快。
当然这是我直观的证明,相比严谨的数学证明,直观上的证明更容易理解些吧。