Fibonacci 数列第 N项 O(logN)算法
时间复杂度为O( log n )的方法:
该算法使用矩阵乘法操作,使得算法时间复杂度为 O(logN)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
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 ) = 1F( 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
class Solution {public: int Fibonacci(int n) { int result[2]={0,1}; if(n<2)return result[n]; Matrix m; return m.Power(n-1).a00; } class Matrix{ public: long int a00; long int a01; long int a10; long int a11; Matrix (long int a,long int b,long int c,long int d){ a00=a; a01=b; a10=c; a11=d; } Matrix (){ a00=1;a01=1;a10=1;a11=0; } Matrix operator * (Matrix & m2){ long int b00 = a00 * m2.a00 + a01 * m2.a10; long int b01 = a00 * m2.a01 + a01 * m2.a11; long int b10 = a10 * m2.a00 + a11 * m2.a10; long int b11 = a10 * m2.a01 + a11 * m2.a11; return Matrix(b00,b01,b10,b11); } Matrix Power( unsigned int n ) { Matrix m; if( n == 1) { m = Matrix(1, 1, 1, 0); } else if(n % 2 == 0) { m = Power( n / 2 ); m = m*m; } else if( n % 2 == 1 ) { m = Power( (n - 1) / 2 ); m = m*m; Matrix tmp; m = m*tmp ; } return m; } }; }; |
Fibonacci 数列第 N项 O(logN)算法的更多相关文章
- Fibonacci数列前n项值的输出(运用递归算法)
1.斐波那契数列: 又称黄金分割数列,指的是这样一个数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 在数学上,斐波纳契数列以如下被以递归的方法 ...
- Problem D: 调用函数,输出Fibonacci数列的m项至n项
#include<stdio.h> int fib(int n)//定义FIbonacci函数 { int s,i; ||n==) { s=; } else { int s1,s2; s1 ...
- c语言经典算法---计算Fibonacci数列
算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.下面我就分享一个C语言中比较基础却极为重要的一个算法----计算Fi ...
- 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: / 0 n=0 f(n)= ...
- 【编程题目】题目:定义 Fibonacci 数列 输入 n,用最快的方法求该数列的第 n 项。
第 19 题(数组.递归):题目:定义 Fibonacci 数列如下:/ 0 n=0f(n)= 1 n=1/ f(n-1)+f(n-2) n=2输入 n,用最快的方法求该数列的第 n 项. 思路:递归 ...
- Fibonacci 数列O(logn)解法
传统解法 提到斐波那契数列(Fibonacci Sequence),首先想到的是经典的动规(DP)算法. 时间复杂度O(n),这里空间复杂度可以优化到O(1).代码如下: int fib_n(int ...
- wikioi 1973 Fibonacci数列【输出第N项的值】
/*===================================== 1978 Fibonacci数列 3 题目描述 Description 斐波纳契数列是这样的数列: f1 = 1 f2 ...
- 递归函数练习:输出菲波拉契(Fibonacci)数列的前N项数据
/*====================================================================== 著名的菲波拉契(Fibonacci)数列,其第一项为0 ...
- 《面试题精选》15.O(logn)求Fibonacci数列
题目:定义Fibonacci数列例如以下: / 0 n=0 f(n)= 1 n=1 ...
随机推荐
- HDU - 2290 Find the Path(最短路)
HDU - 2290 Find the Path Time Limit: 5000MS Memory Limit: 64768KB 64bit IO Format: %I64d & % ...
- 关于odbc连接orcal,用户名密码大小写敏感问题
在oracle的之前版本时, 你的用户名密码是大小写不敏感的, 但在11g中, 数据库默认密码的大小写是敏感的, 于是我们就知道了一个事实, 那就是jdbc在给oracle密码时, 会将其变成大写,真 ...
- 2016腾讯we大会的时间——2016年11月6日
作为腾讯公司主办的一场国际化创新盛会,WE大会由腾讯公司自2013年以来每年举办,WE大会已迎来第四年,每年大会都会邀请全球互联网思想家.前沿创新团队来进行现场演讲和分享,分享最前沿的思想和技术,创造 ...
- 浏览器差异性hack
1 js函数 很多人误以为数组 push 方法拼接字符串会比 += 快,要知道这仅仅是 IE6-8 的浏览器下. 实测表明现代浏览器使用 += 会比数组 push 方法快,而在 v8 引擎中,使用 + ...
- POJ 3710 Christmas Game#经典图SG博弈
http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...
- hdu_2717_Catch That Cow_bfs
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2717 题解:一维简单BFS,详细看代码,0ms. #include<cstdio> #in ...
- MATLAB制作符合IEEE标准的图插入Latex
1.MATLAB最好保存为eps格式,虽然IEEE也支持png等其他格式,但是MATLAB在保存为png格式时,很容易在后期插图时,出现分辨率不足等问题. 2. MATLAB在save as图片的时候 ...
- 为什么推荐Zookeeper作注册中心
Zookeeper的数据模型很简单,有一系列被称为ZNode的数据节点组成,与传统的磁盘文件系统不同的是,zk将全量数据存储在内存中,可谓是高性能,而且支持集群,可谓高可用,另外支持事件监听.这些特点 ...
- delphi 中sql的语法规范
1.引号配对: 这是在Delphi使用SQL语句时容易出错的地方,由于delphi规定在字符串中用两个西文的单引号“''”表示一个“'”,在拼装语句的时候就容易疏忽遗漏. Delphi里有个函数Q ...
- TortoiseGit - Gitblit使用简介
1. 增加Repository http://192.168.242.128:10101 用admin admin登陆后,点击"版本库"--> 创建版本库 填写好 " ...