【算法详解】斐波那契数列 - Fibonacci sequence
2014-02-16 13:25
381 查看
1. 斐波那契数列定义
在线测试工具: http://zh.numberempire.com/fibonaccinumbers.php
2. 算法
求解斐波那契数列的第n个数:2.1 递归/分治法
#include <cstring> #include <iostream> using namespace std; unsigned long fabinacci(unsigned int n) { if (n == 0) { return 0; }else if (n == 1) { return 1; }else { return fabinacci(n - 2) + fabinacci(n - 1); } } int main() { unsigned int n = 0; cout<<"Please input a unsigned integer:"<<endl; cin>>n; cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n); return 0; }
递归效率分析:
以计算f(10)为例:
从图中可以看出:要计算很多重复的之,计算重复值的数量随着N值而急剧增大。事实上该算法的时间复杂度随着n值呈指数增长 O((3/2)^n)。
2.2 迭代求解
循环求解:#include <cstring> #include <iostream> using namespace std; long long fabinacci(unsigned int n) { if (n == 0) { return 0; }else if (n == 1) { return 1; } long long first = 0; long long second = 1; for (unsigned i = 1; i < n; i++) { second = first + second; first = second - first; } return second; } int main() { unsigned int n = 0; cout<<"Please input a unsigned integer:"<<endl; cin>>n; cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n); return 0; }
时间复杂度为:O(n);
2.3 通向求解
2.4 矩阵乘法 / 分治策略
推导:#include <cstring> #include <iostream> using namespace std; void MatrixMulti(long long matrix[2][2],long long matrix2[2][2]) { long long a = matrix[0][0] * matrix2[0][0] + matrix[0][1] * matrix2[1][0]; long long b = matrix[0][0] * matrix2[0][1] + matrix[0][1] * matrix2[1][1]; long long c = matrix[1][0] * matrix2[0][0] + matrix[1][1] * matrix2[1][0]; long long d = matrix[1][0] * matrix2[0][1] + matrix[1][1] * matrix2[1][1]; matrix[0][0] = a; matrix[0][1] = b; matrix[1][0] = c; matrix[1][1] = d; } long long fabinacci(int value) { if(value == 0) { return 0; } long long A[2][2] = {1,1,1,0}; long long Matrix[2][2] = {1,0,1,0}; int n = value - 1; for(; n ;n >>= 1) { //odd if(n&1) { MatrixMulti(Matrix,A); } MatrixMulti(A,A); } return Matrix[0][0]; } int main() { unsigned int n = 0; cout<<"Please input a unsigned integer:"<<endl; cin>>n; cout<<"The "<<n<<"th fabonacci element is: "<<fabinacci(n); return 0; }
时间复杂度:O(log(N));
相关文章推荐
- 算法详解--斐波那契数列
- JVM垃圾回收算法及回收器详解
- 【大数据算法】:apriori算法详解,非常清晰
- 算法导论------渐近记号Θ、Ο、o、Ω、ω详解
- GZIP压缩原理分析(29)——第五章 Deflate算法详解(五20) 动态哈夫曼编码分析(09)构建哈夫曼树(01)
- 几种主流贴图压缩算法的实现原理详解
- 腐蚀,膨胀,细化算法详解
- Aho-Corasick 多模式匹配算法、AC自动机详解
- 数据挖掘之Apriori算法详解和Python实现代码分享
- Java版超大整数阶乘算法代码详解-10,0000级
- [转载] 尺度不变特征变换匹配算法详解
- AI 玩微信跳一跳的正确姿势:跳一跳 Auto-Jump 算法详解
- 机器学习----K-近邻算法(Python代码详解)
- 经典算法—快速排序(Quicksort)使用详解
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- JDA人脸检测算法详解
- SIFT 尺度不变特征变换匹配算法详解
- 算法的时间复杂度详解
- 算法之详解最小生成树
- KMP匹配算法详解