关于Fibonacci算法及Lucas算法说明
2016-03-19 13:31
766 查看
Fibonacci查找算法是基于有序序列的,在二分法查找基础上做出的改进,属于黄金比例搜索算法。Fibonacci数列的每一项与其后一项之比都接近于0.618,而且越往后比值越接近。而Lucas算法则是在Fibonacci算法的基础上又提出来的一个新的黄金比例算法,与Fibonacci的通项公式
Fib(n) = Fib(n - 1) + Fib(n - 2) (n>=2, Fib(1)=0, Fib(2)=1)
不同的是,Lucas的通项公式为
Luc(n) = Luc(n - 1) + Luc(n - 2) (n>=2, Luc(1)=1, Luc(2)=3)
即Fibonacci数列前10项为: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
而Lucas数列的前10项分别: 1, 3, 4, 7, 11, 18, 29, 47, 76, 123
由上式可以明显看出,Lucas列的发散程度较Fibonacci数列大。有数据显示Lucas算法在最优情况下可以比Fibonacci算法更快,当然在最坏情况下也可能更慢。以下为你实现一下Fibonacci查找及Lucas查找。
以下是Fibonacci查找算法的实现,在此做出声明:
本Fibonacci算法不要求待查找序列的长度为某个Fibonacci数列值减1,即长度不受限制
本算法基于待查找序列长度找到小于或等于该序列长度的Fibonacci数列值,并使该数列值做为[low, mid)的区间长度
即(mid, high]的区间长度并不一定是Fibonacci数列值
以上为Fibonacci查找的具体实现步骤,而Lucas其实理同Fibonacci算法,只需要将Fibonacci的类的构造函数中
改为
即可。其实是因为curr要能表示第一位,所以Fibonacci类中构造函数初始化prev为1,因为prev+curr就可以等于curr的下一个数,即1。
Lucas算法的初始化函数理同。
Fib(n) = Fib(n - 1) + Fib(n - 2) (n>=2, Fib(1)=0, Fib(2)=1)
不同的是,Lucas的通项公式为
Luc(n) = Luc(n - 1) + Luc(n - 2) (n>=2, Luc(1)=1, Luc(2)=3)
即Fibonacci数列前10项为: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
而Lucas数列的前10项分别: 1, 3, 4, 7, 11, 18, 29, 47, 76, 123
由上式可以明显看出,Lucas列的发散程度较Fibonacci数列大。有数据显示Lucas算法在最优情况下可以比Fibonacci算法更快,当然在最坏情况下也可能更慢。以下为你实现一下Fibonacci查找及Lucas查找。
/* * 这里采用C++的创建类的方式来实现Fibonacci算法,并将初始化时计算得出的Fibonacci数列值保存起来 * 便于下次直接使用。同时,运用成员函数Prev()和Next()也很方便的获取得到相邻的Fibonacci数列值 */ class Fibon { public: Fibon( int length) { // 根据待查找序列的长度来确定当前的Fibonacci数列值 prev = 1; // 即构造成功后,curr的值最大化的接近length,可能大于或小于等于 curr = 0; while( curr < length) next(); } int GetCurr() const { return curr;} // 获取当前指向的Fibonacci数列值 int Prev() // 不论是前移还是后移,prev和curr都要同步倒退 { prev = curr - prev; // 将上一位置的Fibonacci数列值后退一位 curr = curr - prev; // 将当前位置的Fibonacci数列值后退一位 return curr; } int Next() // 理同Prev函数 { curr = curr + prev; prev = curr - prev; return curr; } private: int prev; // 表示当前位置的前一个Fibonacci数列值 int curr; // 表示当前位置的Fibonacci数列值 };
以下是Fibonacci查找算法的实现,在此做出声明:
本Fibonacci算法不要求待查找序列的长度为某个Fibonacci数列值减1,即长度不受限制
本算法基于待查找序列长度找到小于或等于该序列长度的Fibonacci数列值,并使该数列值做为[low, mid)的区间长度
即(mid, high]的区间长度并不一定是Fibonacci数列值
static int FiboSearch( int *array, int input, int low, int high) { Fibon fibon( high - low); // 根据待查找序列长度计算出相应的Fibonacci数列值 while( low < high) { while( high - low < fibon.GetCurr()) // 每进入一个新的区间,[low, mid)或者(mid, high]都要重新 fibon.Prev(); // 计算一个新的Fibonacci数列值来做为mid int mid = low + fibon.GetCurr() - 1; if( input < array[mi]) high = mid; else if( array[mi] < input) low = mid + 1; else return mid; } return -1; // 如果查找没有结果,统一返回-1 }
以上为Fibonacci查找的具体实现步骤,而Lucas其实理同Fibonacci算法,只需要将Fibonacci的类的构造函数中
prev = 1; curr = 0;
改为
prev = 2; curr = 1;
即可。其实是因为curr要能表示第一位,所以Fibonacci类中构造函数初始化prev为1,因为prev+curr就可以等于curr的下一个数,即1。
Lucas算法的初始化函数理同。
相关文章推荐
- PHP常用的排序和查找算法
- JavaScript黑洞数字之运算路线查找算法(递归算法)实例
- java实现Fibonacci算法实例
- Java基于高精度整型实现fibonacci数列的方法
- 变态组合数C(n,m)求解
- HDU1568(Fobonacci公式)
- Fibonacci数---scheme表示
- 蓝桥练习系统 历届试题 公式求值
- hdu 1021
- C++实现常见的查找算法
- Algs4-1.4.22斐波那契查找算法(Fibonacci Search)Java 实现
- Fibonacci数列的前40个数
- HDOJ 1250 Hat's Fibonacci
- HDOJ 1021 Fibonacci Again
- HDU 1708 Fibonacci String
- Project Euler 25
- 跳台阶
- 矩阵覆盖
- Fibonacci Number Established the Environment of Python
- lur_cache函数缓存