黄金分割:指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1;
0.618被公认为最具有审美意义的比例数字,不仅体现在诸如绘画、雕塑、音乐、建筑等艺术领域,而且在管理、工程设计等方面也有着不可忽视的作用,因此被称为黄金分割;
斐波那契数列:1,1,2,3,5,8,13,21,34,55,89......(从第三个数开始,后边每一个数都是前两个数的和),然后我们会发现,随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,利用这个特性,我们就可以将黄金比例运用到查找技术当中;
基本思想:二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法。
1.要求开始表中记录的个数为某个斐波那契数-1,即n=F(k)-1;
2.开始将key值与第F(k-1)位置的记录进行比较(即mid=low+F(k-1)-1),比较结果分三种:
(1)相等,mid位置的元素即为所求;
(2)>,low=mid+1,k-=2;说明:low=mid+1说明待查找的元素在[mid+1, high]范围内,k-=2说明范围[mid+1, high]内的元素个数为n-F(k-1)=F(k)-1-F(k-1)=F(k-2)-1,所以可以递归地应用斐波那契查找;
(3)<,high=mid-1,k-=1;说明:high=mid-1说明待查找的元素在[low, mid-1]范围内,k-=1说明范围[low, mid-1]内的元素个数为F(k-1)-1,所以可以递归地应用斐波那契查找;
为什么规定n=F(k)-1呢?原因很简单:
是为了格式上的统一,以方便递归或者循环程序的编写。表中的数据是F(k)-1个,使用mid值进行分割又用掉一个,那么剩下F(k)-2个。正好分给两个子序列,每个子序列的个数分别是F(k-1)-1与F(k-2)-1个,格式上与之前是统一的。不然的话,每个子序列的元素个数有可能是F(k-1),F(k-1)-1,F(k-2),F(k-2)-1个,写程序会非常麻烦。
时间复杂度:O(log2^n)
原文地址:https://www.cnblogs.com/yuanfei1110111/p/10205550.html