用log(n)时间复杂度解决Fibonacci问题
2012-07-22 13:21
323 查看
#include <cstdio> class Matrix { public: long mat[2][2]; Matrix(const Matrix&); Matrix(long, long, long, long); Matrix& operator=(const Matrix&); friend Matrix operator*(const Matrix& lhs, const Matrix& rhs) { Matrix ret(0, 0, 0, 0); ret.mat[0][0] = lhs.mat[0][0] * rhs.mat[0][0] + lhs.mat[0][1] * rhs.mat[1][0]; ret.mat[0][1] = lhs.mat[0][0] * rhs.mat[1][0] + lhs.mat[0][1] * rhs.mat[1][1]; ret.mat[1][0] = lhs.mat[1][0] * rhs.mat[0][0] + lhs.mat[1][1] * rhs.mat[1][0]; ret.mat[1][1] = lhs.mat[1][0] * rhs.mat[1][0] + lhs.mat[1][1] * rhs.mat[1][1]; return ret; } }; Matrix::Matrix(long a, long b, long c, long d) { this->mat[0][0] = a; this->mat[0][1] = b; this->mat[1][0] = c; this->mat[1][1] = d; }; Matrix::Matrix(const Matrix& rhs) { this->mat[0][0] = rhs.mat[0][0]; this->mat[0][1] = rhs.mat[0][1]; this->mat[1][0] = rhs.mat[1][0]; this->mat[1][1] = rhs.mat[1][1]; }; Matrix& Matrix::operator=(const Matrix& rhs) { this->mat[0][0] = rhs.mat[0][0]; this->mat[0][1] = rhs.mat[0][1]; this->mat[1][0] = rhs.mat[1][0]; this->mat[1][1] = rhs.mat[1][1]; return *this; }; Matrix power(const Matrix& x, int n) { if(n == 1) return x; if(n % 2 == 0) return power(x * x, n / 2); else return power(x * x, n / 2) * x; }; long fib(int n) { Matrix mat(1, 1, 1, 0); mat = power(mat, n - 1); return mat.mat[0][0]; }; int main() { int res = fib(3); return 0; }
主要思想为 矩阵乘法
题目: http://www.careercup.com/question?id=14237663
参考:http://songyishan.iteye.com/blog/1166608
另外这个算法没有仔细看,不知道是否可以:http://www.cnblogs.com/end/archive/2011/10/26/2225723.html
相关文章推荐
- Manacher算法解决最长回文子串问题---O(n)时间复杂度
- 【问题解决】删除链表结点,要求时间复杂度为O(1)
- 关于SelfNumbers问题时间复杂度问题解决方案
- 用NSIS安装日志install。log解决了一个安装出现隐蔽的问题、不用看代码,可以节省大把时间!开心!
- 强大的随机算法-简洁的O(n)时间复杂度解决查找第k大数问题优化算法
- 用哈希算法的思想解决排序和字符串去重问题,时间复杂度为O(N)
- 对经典算法百鸡百钱问题的优化解决,使其时间复杂度为n。
- C++解决最大子列和问题,算法时间复杂度优化
- 茗洋芳竹Easy UI 部分问题解决系列专题[datagrid 复杂表头]
- C3P0连接池配置解决MySQL连接的空闲时间超过8小时后自动断开连接的问题
- 解决复杂布局中跑马灯不能跑的问题
- 如何解决weblogic时间与系统时间相差8个小时的问题!
- Ubuntu 16.04下没有/var/log/messages文件问题解决
- 解决JAVA获取Windows系统时间问题
- [Dataguard]ORA-16191: Primary log shipping client not logged on standby问题解决
- 解决Cocos2dx新建项目编译时间过长等问题
- 动态规划;漂亮打印问题;时间复杂度O(n方); 思考方法记录在内;
- SQL删除数据因外键关联导致花费时间太长----(外键列上增加索引解决此问题)
- linux环境下时区无法设置(系统时间慢8个小时)的问题解决
- 符号三角形问题;回溯算法;子集树问题;时间复杂度O(2的n次方);