码迷,mamicode.com
首页 > 编程语言 > 详细

Fibonacci 数列第 N项 O(logN)算法

时间:2016-03-16 20:45:40      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:

时间复杂度为O( log n )的方法:

 该算法使用矩阵乘法操作,使得算法时间复杂度为 O(logN)

技术分享
技术分享
long long Fibonacci( unsigned n )   
{   
      int result[2] = {0, 1};   
      if(n < 2)   
            return result[n];   

      long long   fibOne = 0;   
      long long   fibTwo = 1;   
      long long   fibThree ;   
    
      for(unsigned int i = 2; i <= n; ++ i)   
       {   
             fibThree = fibOne + fibTwo;   
      fibOne = fibTwo ;   
             fibNTwo = fibThree;   
        }   
        return fibThree;   
}
 

/*
下面介绍一种时间复杂度是O(logn)的方法:

对于斐波那契数列1,1,2,3,5,8,13…….有如下定义:

F( n ) = F( n-1 ) + F( n-2 )
F( 1 ) = 1
F( 2 ) = 1

矩阵形式:

[ F( n+1 ) ,  F( n ) ] = [ F( n ) , F( n-1 ) ] * Q  其中 [ F( n+1 ) ,  F( n ) ]为行向量,Q = { [ 1, 1 ]; [ 1, 0 ] }为矩阵

则 [ F( n+1 ) , F( n ) ]=[ 1 , 0 ] * Qn , 
*/struct Matrix    
{          
       long long m_00, m_01, m_10, m_11;   
   Matrix ( long long m00 = 0,  long long m01 = 0,  long long m10 = 0,   long long m11 = 0 )    
       :m_00( m00 ), m_01( m01 ), m_10( m10 ), m_11( m11 )     
       {    
       }    
};
 

Matrix MatrixMultiply (  const Matrix & m1, const Matrix & m2    )    
{  
  long long m00 = m1.m_00 * m2.m_00 + m1.m_01 * m2.m_10;
  long long m01 = m1.m_00 * m2.m_01 + m1.m_01 * m2.m_11; 
  long long m10 = m1.m_10 * m2.m_00 + m1.m_11 * m2.m_10    
  long long m11 = m1.m_10 * m2.m_01 + m1.m_11 * m2.m_11; 
      return Matrix ( m00,  m01,  m10, m11 );    
}

Matrix MatrixPower( unsigned int n )    
{    
       assert(n > 0);    
       Matrix m;    
       if( n == 1)    
       {    
             m = Matrix(1, 1, 1, 0);    
       }    
      else if(n % 2 == 0)    
       {    
             m = MatrixPower( n / 2 );    
             m = MatrixMultiply( matrix, matrix );    
       }    
      else if( n % 2 == 1 )    
       {    
             m = MatrixPower( (n - 1) / 2 );    
             m = MatrixMultiply( m, m );    
             m = MatrixMultiply( m, Matrix( 1, 1, 1, 0 ) );    
       }     
      return m;    
}  
long long Fibonacci( unsigned int n )
{
      int result[2] = { 0, 1 };
      if( n < 2 )
            return result[ n ];

      Matrix Q = MatrixPower( n - 1 );  //注意:按定义式应该用[ 1, 0 ]*Q, 或者等价于{ [ 1 , 0 ]; [ 0, 0 ] }*Q, 但是因为显然结果相同,所以略去这一步。return Q.m_00;
}
技术分享
技术分享

 




牛客网答案
  1. class Solution {
  2. public:
  3. int Fibonacci(int n) {
  4. int result[2]={0,1};
  5. if(n<2)return result[n];
  6. Matrix m;
  7. return m.Power(n-1).a00;
  8. }
  9. class Matrix{
  10. public:
  11. long int a00;
  12. long int a01;
  13. long int a10;
  14. long int a11;
  15. Matrix (long int a,long int b,long int c,long int d){
  16. a00=a;
  17. a01=b;
  18. a10=c;
  19. a11=d;
  20. }
  21. Matrix (){
  22. a00=1;a01=1;a10=1;a11=0;
  23. }
  24. Matrix operator * (Matrix & m2){
  25. long int b00 = a00 * m2.a00 + a01 * m2.a10;
  26. long int b01 = a00 * m2.a01 + a01 * m2.a11;
  27. long int b10 = a10 * m2.a00 + a11 * m2.a10;
  28. long int b11 = a10 * m2.a01 + a11 * m2.a11;
  29. return Matrix(b00,b01,b10,b11);
  30. }
  31. Matrix Power( unsigned int n )
  32. {
  33. Matrix m;
  34. if( n == 1)
  35. {
  36. m = Matrix(1, 1, 1, 0);
  37. }
  38. else if(n % 2 == 0)
  39. {
  40. m = Power( n / 2 );
  41. m = m*m;
  42. }
  43. else if( n % 2 == 1 )
  44. {
  45. m = Power( (n - 1) / 2 );
  46. m = m*m;
  47. Matrix tmp;
  48. m = m*tmp ;
  49. }
  50. return m;
  51. }
  52. };
  53. };

 




Fibonacci 数列第 N项 O(logN)算法

标签:

原文地址:http://www.cnblogs.com/zhxshseu/p/5284962.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!