时间复杂度为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 ) = 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
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 ...
随机推荐
-
Android新建数据库和建表demo
public class DBHelper extends SQLiteOpenHelper{ public final static String DATABASENAME ="diary ...
-
Hadoop学习之编译eclipse插件
近期准备開始学习Hadoop1.2.1的源码,感觉最好的方法还是能够在运行Hadoop及hadoop作业时跟踪调试代码的实际运行情况.因为选择的IDE为eclipse,所以准备编译一下hadoop的e ...
-
Android XML解析器的问题
最近在项目中遇到了一个解析XML的问题,我们是用android自带的DOM解析器来解析XML的,但发现了一个android的问题,那就是在2.3的SDK上面,无法解析像<, >, 等字符串 ...
-
与文件上传到的三个类:FileItem类、ServletFileUpload 类、DiskFileItemFactory类
文件上传: ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中, 在使用ServletFileUpload对象解析请求时需要根据DiskFi ...
-
后台运行之[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]
// 正常程序退出后,会在几秒内停止工作: // 要想申请更长的时间,需要用到 // beginBackgroundTaskWithExpirationHandler // endBackground ...
-
Java基础知识回顾之四 ----- 集合List、Map和Set
前言 在上一篇中回顾了Java的三大特性:封装.继承和多态.本篇则来介绍下集合. 集合介绍 我们在进行Java程序开发的时候,除了最常用的基础数据类型和String对象外,也经常会用到集合相关类. 集 ...
-
【Android】自定义ListView的Adapter报空指针异常解决方法
刚刚使用ViewHolder的方法拉取ListView的数据,但是总会报异常.仔细查看代码,都正确. 后来打开adapter类,发现getView的返回值为null. 即return null. 将n ...
-
php安装grpc报No releases available for package解决方法
1.pecl.php.net搜索相应grpc的下载文件,这里找了个stable版本 https://pecl.php.net/get/grpc-1.17.0.tg 2.wge下载+pecl insta ...
-
4412 uboot启动分析
感谢sea1105, https://blog.csdn.net/sea1105/article/details/52142772 在学习过程中,由于tiny4412资料太过于少,因此参考210的视屏 ...
-
python之tkinter使用-简单对话框
# 简单对话框,包括字符.整数和浮点数 import tkinter as tk from tkinter import simpledialog def input_str(): r = simpl ...