斐波那契数列求解的优化

来源:互联网 发布:深圳天穹网络怎么样 编辑:程序博客网 时间:2024/04/25 17:40

题目:给定整数N,返回斐波那契数列的第N项。

解法一:暴力递归,时间复杂度为O(2^N)
int fun(int n){    if(n < 1)    {        return 0;    }    else if(n ==1 || n ==2)    {        return 1;    }    return fun(n-1) + fun(n-2);}

解法二:保存前面求出的值,时间复杂度为O(N)

int fun(int n){    if(n < 1)    {        return 0;    }    else if(n ==1 || n ==2)    {        return 1;    }    else    {        int res1 = 1, res2 = 1;        int result = 1, i = 0;        for(i = 3; i <= n; i++)        {            result = res1 + res2;            res1 = res2;            res2 = result;        }        return result;    }}

解法三:采用矩阵乘法,把时间复杂度降为O(logN)

 递归优化的通用公式如下:

#include <iostream>#include <vector>using namespace std;/* 矩阵的乘法,m1,m2是两个矩阵,结果为result */int mulMatrix(vector<vector<int> > m1, vector<vector<int> > m2, vector<vector<int> > &result){    int i = 0, j = 0, k = 0;    /* 如果不符合矩阵相乘的条件 */    if (m1.size() != m2[0].size())    {        return 1;    }    for(i = 0; i < m2[0].size(); i++)//result的行标    {        for(j = 0; j < m1.size(); j++)//result的下标        {            /* 先把这个地方数值,清零 */            result[i][j] = 0;            for(k = 0; k < m2.size(); k++)//每次加的个数            {                result[i][j] += m1[i][k] * m2[k][j];            }        }    }    return 0;}/* 求m矩阵的n次方 */int matrixPower(vector<vector<int> > m, int p, vector<vector<int> > &result){    int i = 0;    vector<vector<int> > temp = m;    vector<vector<int> > tempp;    /* 把result设为单位矩阵,相当于整数中的1 */    for(i = 0; i < m.size(); i++)    {        result[i][i] = 1;    }    for(; p != 0; p >>= 1)    {        if ((p & 1) != 0 )        {            tempp = result;            mulMatrix(tempp,temp,result);        }        tempp = temp;        mulMatrix(tempp,tempp,temp);    }}/* 求斐波那契数列第N项 */int fun(int n){    if (n < 1)    {        return 0;    }    else if (n == 1 || n == 2)    {        return 1;    }    /* 构建矩阵 */    vector<vector<int> > base(2);    base[0].push_back(1);    base[0].push_back(1);    base[1].push_back(1);    base[1].push_back(0);    vector<vector<int> >res(2);    res[0].push_back(0);    res[0].push_back(0);    res[1].push_back(0);    res[1].push_back(0);    matrixPower(base,n-2,res);    return res[0][0] + res[1][0];}int main( void ){/*    vector<vector<int> > m1(2);    m1[0].push_back(1);    m1[0].push_back(2);    m1[1].push_back(1);    m1[1].push_back(2);    vector<vector<int> > m3 = m1;    m3[0][0] = 0;    m3[0][1] = 0;    m3[1][0] = 0;    m3[1][1] = 0;    matrixPower(m1,3,m3);    cout << m3[0][0] << " " << m3[0][1] << endl;    cout << m3[1][0] << " " << m3[1][1] << endl;*/    cout << fun(5) << endl;    return 0;}



0 0
原创粉丝点击