斐波那契的几种思路,你都会吗
创始人
2024-05-02 23:36:52
0

文章目录

  • 递归
  • 数组
  • 迭代
  • 矩阵快速幂
  • 对角化(通项)

茴字的四种写法,你都会么?

递归

  • 时间>O(n)
  • 空间O(1)
int fibo(int n){if(1==n || 2==n)	return 1;return fibo(n-1) + fibo(n-2);
}

数组

  • 时间O(n)
  • 空间O(n)
#define MAXN 100
int fibo(int n){int dp[MAXN];dp[0] = 0; dp[1] = 1;for(int i=2; i<=n; i++){dp[i] = dp[i-1] + dp[i-2];}return dp[n];
}

迭代

  • 时间O(n)
  • 空间O(1)
int fibo(int n){int f1=1, f2=1, f;while(n>=3){n--;f = f1+f2;f1 = f2;f2 = f;}return f;
}

矩阵快速幂

  • 时间O(logn)
  • 空间O(1)

已知xt+1=xt+xt−1\Large x_{t+1} = x_t + x_{t-1}xt+1​=xt​+xt−1​, 令Xt=[xt−1,xt]T\Large X_t=[x_{t-1}, x_t]^TXt​=[xt−1​,xt​]T, 则有
Xt=[0111]Xt−1=[0111]t−1X1=[0111]t−1[01]\Large X_{t} = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}X_{t-1} =\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}^{t-1}X_1 = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}^{t-1}\begin{bmatrix} 0 \\ 1 \end{bmatrix} Xt​=​01​11​​Xt−1​=​01​11​​t−1X1​=​01​11​​t−1​01​

Eigen::Matrtix2f fast_power(Eigen::Matrix2f& mat, int n){if(0 == n)	return Eigen::Matrix2x::Identity();if(1 == n)	return mat;if(n&2) return mat*fast_power(mat, n-1);Eigen::Matrix2f tmp = fast_power(mat, n>>1);return tmp*tmp;
}int fibo(int n){Eigen::Matrix2f base;base << 0, 1, 1, 1;Eigen::Matrix2f X1;X1 << 0, 1;return (int)(fast_power(base, n-1)*X1)[1];
}

对角化(通项)

  • 时间O(1)
  • 空间O(1)

在上式中, 令A=[0111]\Large A=\begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}A=​01​11​​, 得到两个特征值λ1=1+52,λ2=1−52\Large \lambda_1=\frac{1+\sqrt{5}}{2}, \lambda_2=\frac{1-\sqrt{5}}{2}λ1​=21+5​​,λ2​=21−5​​, 以及对应的特征向量η1=[11+52],η2=[11−52]\Large \eta_1=\begin{bmatrix} 1 \\ \frac{1+\sqrt{5}}{2} \end{bmatrix}, \eta_2=\begin{bmatrix} 1 \\ \frac{1-\sqrt{5}}{2} \end{bmatrix}η1​=​121+5​​​​,η2​=​121−5​​​​. 那么很容易将A\Large AA对角化:
A=P−1ΣP\Large A = P^{-1} \Sigma P A=P−1ΣP
其中β1=η1∣η1∣,β2=η2∣η2∣,P=[β1,β2],Σ=diag(λ1,λ2)\Large \beta_1 = \frac{\eta_1}{|\eta_1|}, \beta_2 = \frac{\eta_2}{|\eta_2|}, P = [\beta_1, \beta_2], \Sigma=diag(\lambda_1, \lambda_2)β1​=∣η1​∣η1​​,β2​=∣η2​∣η2​​,P=[β1​,β2​],Σ=diag(λ1​,λ2​). 这里由于η1,η2\Large \eta_1, \eta_2η1​,η2​属于不同的特征值,已经能够保证正交,因此不需要额外的正交化.

那么有
At=(P−1ΣP)t=P−1ΣtP\Large A^{t} = (P^{-1}\Sigma P)^t = P^{-1}\Sigma^t P At=(P−1ΣP)t=P−1ΣtP
那么前面求Xt\Large X_tXt​也变得简单了
Xt=[0111]t−1[01]=At−1[01]=P−1Σt−1P[01]\Large X_{t} = \begin{bmatrix} 0 & 1 \\ 1 & 1 \end{bmatrix}^{t-1}\begin{bmatrix} 0 \\ 1 \end{bmatrix} = A^{t-1}\begin{bmatrix} 0 \\ 1 \end{bmatrix} = P^{-1}\Sigma^{t-1} P \begin{bmatrix} 0 \\ 1 \end{bmatrix} Xt​=​01​11​​t−1​01​​=At−1​01​​=P−1Σt−1P​01​
上式中, P\large PP是一个二阶方阵,求逆计算量并不大. Σ\Large \SigmaΣ是一个二阶对角阵, 幂方也只需要给对角线元素幂方即可. 上式的计算量其实并不大.

这里最大的问题是精度损失, 有可能在计算过程中会因为float精度的问题,导致结果转换为int时存在一定的误差.

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...