第十九题(最快的方法求Fibonacci数列)
来源:互联网 发布:淘宝优惠券赚佣金软件 编辑:程序博客网 时间:2024/05/22 08:01
题目:定义Fibonacci 数列如下:
/ 0 n=0
f(n)= 1 n=1
\ f(n-1)+f(n-2) n=2
/ 0 n=0
f(n)= 1 n=1
\ f(n-1)+f(n-2) n=2
输入n,用最快的方法求该数列的第n 项。
1.采用递归求解,函数的调用过程中,每个函数都都分裂成两个函数,计算的结果没有保存,出现了大量重复计算,算法复杂度O(2^n)
2.采用从下往上的循环结构,时间复杂度O(n)
3.采用矩阵求解,数列中的第n项是矩阵
11
10
n-1次方后所得矩阵的最左上角元素。
因此可以通过矩阵的乘方求解,为了追求更优的时间效率,不采用普通的循环n次乘方的方法,而是采用分治的思想,把n次方换成n/2的平方,以此类推,最终可以达到log(n)的复杂度。
代码:
#include<iostream>using namespace std;namespace MS100P_19{//采用递归的方法,复杂度O(2^n)int Fibonacci_Recursive(int n){if (n == 0)return 0;if (n == 1)return 1;else return Fibonacci_Recursive(n - 1) + Fibonacci_Recursive(n - 2);}//非递归1,时间复杂度 O(n)int Fibonacci_1(int n){long smaller = 0;long bigger = 1;long sum=0;if (n == 0)return 0;if (n == 1)return 1;for (int i = 2; i <=n; i++){sum = smaller + bigger;smaller = bigger;bigger = sum;}return bigger;}//非递归,时间复杂度O(logN)struct matrix{long long m00, m01;long long m10, m11;matrix(long long parM00, long long parM01, long long parM10, long long parM11)\:m00(parM00), m01(parM01), m10(parM10), m11(parM11){}matrix() :m00(1), m01(1), m10(1), m11(0){}};matrix matrixMultiply(const matrix& mtx1, const matrix& mtx2){return matrix(mtx1.m00*mtx2.m00 + mtx1.m01*mtx2.m10, mtx1.m00*mtx2.m01 + mtx1.m01*mtx2.m11, \mtx1.m10*mtx2.m00 + mtx1.m11*mtx2.m10, mtx1.m10*mtx2.m01 + mtx1.m11*mtx2.m11);}matrix matrixPower(int power)//n为指数{matrix temp;if (power == 1)return temp;if (power % 2 == 0){temp = matrixPower(power / 2);return matrixMultiply(temp, temp);}else{temp = matrixPower(power / 2);temp = matrixMultiply(temp, temp);return matrixMultiply(temp,matrix());}}long long Fibonacci_2(int n){if (n == 0)return 0;if (n == 1)return 1;else return matrixPower(n - 1).m00;}void test(){cout << Fibonacci_Recursive(1) << endl;cout << Fibonacci_1(1) << endl;cout << Fibonacci_2(1) << endl;cout << Fibonacci_Recursive(10) << endl;cout << Fibonacci_1(10) << endl;cout << Fibonacci_2(10) << endl;}}int _tmain(int argc, _TCHAR* argv[]){MS100P_19::test();return 0;}
0 0
- 第十九题(最快的方法求Fibonacci数列)
- 【微软100题】输入n,用最快的方法求Fibonacci数列的第n项
- 定义Fibonacci数列,输入n,用最快的方法求该数列的第n项
- 输入n,用最快的方法求Fibonacci 数列的第n 项
- 微软面试100题之19题:定义Fibonacci 数列如下,用最快的方法求该数列的第n 项
- 19.定义Fibonacci数列,输入n,用最快的方法求该数列的第n项
- 数据结构——算法之(014)( 输入n,用最快的方法求Fibonacci数列的第n项)
- <仅是自己做笔记。。。系列-11>输入n,用最快的方法求Fibonacci数列的第n项。
- 17. 微软面试题:用最快的方法计算出 Fibonacci数列中的第n项
- 定义Fibonacci数列如下: / 0 n=0 f(n)= 1 n=1 \ f(n-1)+f(n-2) n=2 输入n,用最快的方法求该数列的第n项。
- 七种方法求Fibonacci数列
- 每天学习一算法系列(19)(输入n,用最快的方法求该数列的第n 项)
- 求Fibonacci数列的前10个数
- 求Fibonacci数列的前四十个数
- HITOJ 1864 求Fibonacci数列的位数
- 求Fibonacci数列的前30项
- 求Fibonacci数列的第n项
- 求Fibonacci数列的循环节
- html/js 实现背景图片自适应窗口分辨率大小
- 回顾图经典Dijstra算法
- Ant_的最完整build.xml解释
- KMP算法
- [Android] 如何将ActionBar的侧选单按钮切换为返回按钮
- 第十九题(最快的方法求Fibonacci数列)
- android设置屏幕禁止休眠的方法
- 设置只能编辑当前行
- Bash脚本15分钟进阶教程
- linux的C程序 调用 shell脚本,获取shell的执行结果
- LINUX环境下Samba服务器的简单搭建教程
- Hibernate懒加载解析
- Kolya and Tandem Repeat
- 正则表达式