【算法详解】斐波那契数列 - Fibonacci sequence

来源:互联网 发布:ecshop 打印sql语句 编辑:程序博客网 时间:2024/05/17 06:54

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;}elseif (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;}elseif (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){//oddif(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))










0 0