Computational Complexity of Fibonacci Sequence / 斐波那契数列的时空复杂度
\(F(n) = F(n-1)+F(n-2)\),其中 \(F(0)=0, F(1)=1\),即该数列由 0 和 1 开始,之后的数字由相邻的前两项相加而得出。
递归
def fibonacci(n):
assert n >= 0, 'invalid n'
if n < 2: return n
return fibonacci(n - 1) + fibonacci(n -2)
递归方法的时间复杂度为高度为 \(n-1\) 的不完全二叉树的节点数,所以近似为 \(O(2^n)\)
数学求解方法:
\(T(n) = T(n-1) + T(n-2) \qquad (n>1)\)
设 \(f(n)\) 为参数为 n 时的时间复杂度 \(f(n) = f(n-1) + f(n-2)\)
转化为求二阶常系数齐次差分方程,设通解为 \(f_{n} = C_{1}f_{n-1} + C_{2}f_{n-2}\)
设有特解 \(f_{n} = \lambda\),\(\lambda\) 为非零待定常数,将 \(\lambda\) 代入方程,易得特征方程 \(\lambda ^{2} = \lambda + 1\),则 \(λ = \frac{1\pm \sqrt{5}}{2}\)
再根据 \(f(0) = 0, f(1) = 1.\) 求出 \(C_{1}\) 和 \(C_{2}\)
得出通项公式
\[
f(n) = \frac{1}{\sqrt{5}}[(\frac{1+ \sqrt{5}}{2})^{n} - (\frac{1- \sqrt{5}}{2})^{n}]
\]
当 \(n->\infty\) 时, \(\left |(\frac{1- \sqrt{5}}{2})^{n} \right |<1\),所以趋于零。
时间复杂度为 \(O((\frac{1+ \sqrt{5}}{2})^{n})\) ,约等于 \(O(1.618^{n})\) ,即指数级复杂度 \(O(2^n)\),递归算法空间复杂度取决于递归的深度,显然为 \(O(n)\)。
迭代
def fibonacci(n):
assert n >= 0, 'invalid n'
if n == 0: return 0
a, b = 0, 1
for _ in range(n - 1):
a, b = b, a+b
return b
时间复杂度 \(O(n)\),空间复杂度 \(O(1)\)
矩阵
\(F(n)\) 和 \(F(n - 1)\) 写成一个 2 x 1 的矩阵,然后对其进行变形。
\(\begin{bmatrix}F_{n}\\F_{n-1}\end{bmatrix}=\begin{bmatrix}F_{n-1}+F_{n-2}\\F_{n-1}\end{bmatrix}=\begin{bmatrix}1\times F_{n-1}+1\times F_{n-2}\\1\times F_{n-1}+0\times F_{n-2}\end{bmatrix}=\begin{bmatrix}1 & 1\\ 1 & 0\end{bmatrix}\times\begin{bmatrix}F_{n-1}\\F_{n-2}\end{bmatrix}=...=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-1}\times\begin{bmatrix}F_{1}\\F_{0}\end{bmatrix}=\begin{bmatrix}1&1\\1&0\end{bmatrix}^{n-1}\times\begin{bmatrix}1\\0\end{bmatrix}\)
因此要求 \(F_{n}\),只要对这个二阶方阵求 \(n - 1\) 次方,最后取结果方阵第一行第一列的数字就可以了。
等式中的矩阵 \(\begin{bmatrix}1&1\\1&0\end{bmatrix}\) 被称为斐波那契数列的 Q- 矩阵。
通过 Q- 矩阵,我们可以利用如下公式进行计算:
\(F_{n} = Q^{n-1}_{1,1}\)
如此一来,计算斐波那契数列的问题就转化为了求 \(Q^{n-1}\) 的问题。
\[
A^{n} = \begin{cases} A\cdot (A^{2})^{\frac{n-1}{2}}, & \text{if $n$ is odd} \\\ (A^{2})^{\frac{n}{2}}, & \text{if $n$ is even} \\ \end{cases}
\]
可见时间复杂度满足 \(T(n) = T(n / 2) + O(1)\)
由 Master 定理 可得
时间复杂度 \(O( \log n)\) ,空间复杂度显然为 \(O(1)\)
from numpy import matrix
def MatrixPower(mat, n):
assert n > 0, 'invalid n'
res = None
temp = mat
while True:
if n & 1:
if res is None: res = temp
else: res = res * temp
n >>= 1
if n == 0: break
temp = temp * temp
return res
def fibonacci(n):
assert n >= 0, 'invalid n'
if n < 2: return n # F(0) = 0, F(1) = 1
mat = matrix([[1, 1], [1, 0]], dtype=object)
mat = MatrixPower(mat, n - 1)
return mat[0, 0]
通项公式法


def fibonacci(n):
root_Five = 5**0.5
result = (((1 + root_Five) / 2)**n - ((1 - root_Five) / 2)**n) / root_Five
return int(result)
显然,该方法的时空复杂度均为 \(O(1)\) , 但使用公式计算的方法由于有大量的浮点运算,在 n 增大时浮点误差不断增大会导致返回结果不正确甚至数据溢出。
| 方法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 递归 | \(O(2^{n})\) | \(O(n)\) |
| 迭代 | \(O(n)\) | \(O(1)\) |
| 矩阵 | \(O(log^{n})\) | \(O(1)\) |
| 公式 | \(O(1)\) | \(O(1)\) |
Computational Complexity of Fibonacci Sequence / 斐波那契数列的时空复杂度的更多相关文章
- ***1133. Fibonacci Sequence(斐波那契数列,二分,数论)
1133. Fibonacci Sequence Time limit: 1.0 secondMemory limit: 64 MB is an infinite sequence of intege ...
- 10、end关键字和Fibonacci series: 斐波纳契数列
# Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 #复合赋值表达式,a,b同时赋值0和1 while b < 10: print(b ...
- [Amazon] Program for Fibonacci numbers 斐波那契数列
The Fibonacci numbers are the numbers in the following integer sequence. 0, 1, 1, 2, 3, 5, 8, 13, 21 ...
- Fibonacci series(斐波纳契数列)的几种常见实现方式
费波那契数列的定义: 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数.斐波那契数列.斐波那契数列.黄金切割数列. 在数学上,费波那契数列是以递归的方法来定义 ...
- 【算法】Fibonacci(斐波那契数列)相关问题
一.列出Fibonacci数列的前N个数 using System; using System.Collections.Generic; using System.Linq; using System ...
- 509. Fibonacci Number斐波那契数列
网址:https://leetcode.com/problems/fibonacci-number/ 原始的斐波那契数列 运用自底向上的动态规划最佳! 可以定义vector数组,但是占用较多内存空间 ...
- POJ 3070 Fibonacci【斐波那契数列/矩阵快速幂】
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17171 Accepted: 11999 Descr ...
- Fibonacci(斐波那契数列)的第N位数
无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地定义为F(n)=1 ...........(n=1或n=2)F(n)=F(n-1)+F(n-2).. ...
- 【LeetCode每天一题】Fibonacci Number(斐波那契数列)
The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such th ...
随机推荐
- Educational Codeforces Round 81 (Rated for Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1295 A. Display The Number 贪心思路,尽可能放置更多位,如果n为奇数,消耗3去放置一个7,剩下的放1 AC ...
- 【译】通过 Rust 学习解析器组合器 — Part 1
原文地址:Learning Parser Combinators With Rust 原文作者:Bodil 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gol ...
- Apache Kafka(七)- Kafka ElasticSearch Comsumer
Kafka ElasticSearch Consumer 对于Kafka Consumer,我们会写一个例子用于消费Kafka 数据传输到ElasticSearch. 1. 构造ElasticSear ...
- (c#)拼写单词
题目 解
- 【网易官方】极客战记(codecombat)攻略-地牢-轰轰
关卡连接: https://codecombat.163.com/play/level/pong-pong 挑战:使用迄今为止学到的所有编程技巧编写最短的解决方案! 简介: 单挑,这是特殊的挑战关卡! ...
- 抽象工厂模式(JAVA反射)
实例代码(JAVA):模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方 ...
- unittest框架,漂亮的报告BeautifulReport配置与错误截图详细解说
1.下载BeautifulReport模块 下载地址:https://github.com/TesterlifeRaymond/BeautifulReport 2.解压与存放路径 下载Beautifu ...
- 左偏树(p4431)
难得不是左偏树,而是思维: 这道题在做得时候,有两个性质 1.如果a是一个不下降序列,那么b[i]==a[i]时取得最优解. 2.如果a是一个严格递减序列,则取a序列的中位数x,令b[1]=b[2]= ...
- 折纸(folding)
问题 C: 折纸 时间限制: 1 Sec 内存限制: 128 MB[提交] [状态] 题目描述 现有一个W*H的矩形纸张,求至少要折多少次才能使矩形纸张变成w*h的矩形纸张.注意,每次的折痕都要平行 ...
- MySQL数据完整性
数据完整性 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型.约束 ...