- UID
- 604462
- 积分
- 3865
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2008-3-12
- 最后登录
- 1970-1-1
|
发表于 2016-6-3 13:50:07
|
显示全部楼层
下面算法的时间复杂度能到 ologn, 楼主试试改造下你的代码
 - 题目:定义Fibonacci数列如下:
- / 0 n=0
- f(n)= 1 n=1
- \ f(n-1)+f(n-2) n=2
-
- 输入n,用最快的方法求该数列的第n项。
- 分析:第一种思路。如果使用递归的方法计算,每次都会重复计算之前计算过的f(n)的值,针对这种计算的重复问题,如果我们每次都记录之前计算过的的f(n)的值,就可以避免重复计算。上述方法的时间复杂度为o(n)。
- 第二种思路。上述算法还不是最快的计算方法。[f(n-1) f(n)] = A^(n-1)[f(1) f(0)],这个公式在这里不推导了,其中A=[1,1;1,0],使用矩阵的幂的快速算法,我们可以讲f(n)计算的时间复杂度降低到o(log(n))。
- 第一种思路的代码:
-
- int Fibonacci(int n){
- int result[2]={0,1};
- if(n<2)
- return result[n];
- int fibsum;
- int fibone = 1;
- int fibtwo = 0;
- for(int i=1;i<n-1;i++){
- fibsum = fibone + fibtwo;
- fibtwo = fibone;
- fibone = fibsum;
- }
- return fibsum;
- }
- 第二种思路的代码:
-
- #include <iostream>
- using namespace std;
- struct mx{
- int m,n;
- int matrix[2][2];
- };
- mx multiply(mx a,mx b){
- int i,j,k,s;
- mx ans={2,2,{0,0,0,0}};
- for(i=0;i<a.m;i++){
- for(j=0;j<b.n;j++){
- s = 0;
- for(k=0;k<a.n;k++)
- s += a.matrix[k]*b.matrix[k][j];
- ans.matrix[j] = s;
- }
- }
- return ans;
- }
- mx MatPow(mx a,int b){
- mx s={2,2,{1,0,0,1}};
- while(b){
- if(b&1)
- s = multiply(s,a);
- a = multiply(a,a);
- b>>=1;
- }
- return s;
- }
- int Fibonacci_Matrix(int n){
- mx s={2,2,{1,1,1,0}};
- s = MatPow(s,n-1);
- return s.matrix[0][0];
- }
-
- void main(){
- int n = 3;
- int m = Fibonacci_Matrix(n);
- cout<<m<<endl;
- system("pause");
- }
|
|