斐波那契数列求解的优化
来源:互联网 发布:深圳天穹网络怎么样 编辑:程序博客网 时间: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
- 斐波那契数列求解的优化
- 波那契数列的复杂度求解
- 斐波那契数列的优化
- 斐波那契数列的优化
- 递归求解斐波那契数列
- 递归-求解斐波那契数列
- 斐波那契数列求解
- 02 求解斐波那契数列
- 斐波那契数列求解
- poj3070斐波那契数列求解
- python求解斐波那契数列
- 求解斐波那契数列
- 斐波那契数列求解python3
- 求解斐波那契数列的几种方法
- 基于特征值的斐波那契数列求解
- 基于特征值的斐波那契数列求解
- 斐波那契数列的几种求解方法
- 求解斐波那契数列的动态规划方法
- redis.conf配置文件说明
- 关于Python中的yield
- STM32 IAP文档 IAP/inc/stm32f10x_it.h 文档参考
- MySQL 加锁处理分析
- 电视剧《大秧歌》随感
- 斐波那契数列求解的优化
- VS1053声音外放实现
- Ubuntu中 JDK的安装和卸载
- ora -00937:不是单组分组函数
- escape()、encodeURI()、encodeURIComponent()区别详解
- windows Mobile 6.0开发环境的搭建
- Calendar计算时间
- Xcode7 https -- http
- Hive_11. Join 总结 -- 待完善