[数据结构 C++(2)]:Fibonacci数 不同复杂度求法

本文深入探讨了Fibonacci数列的多种求解方法,包括二分递归、线性递归、迭代及power2方法,分析了各自的优劣及时间复杂度。通过特征方程解出通项公式,并提供了不同算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fibonacci数列求解

fib(n)={nn⩽1fib(n−1)+fib(n−2)n⩾2 fib(n)=\left\{\begin{array}{l}{n} &n\leqslant1\\ {fib(n-1)+fib(n-2)}&n\geqslant2\end{array}\right. fib(n)={nfib(n1)+fib(n2)n1n2

1. 二分递归,时间复杂度:O(2n)O(2^n)O(2n)
int fib(int n){
	return (2 > n) ? n : fib(n - 1) + fib(n - 2);
}

花费时间为T(n)T(n)T(n),递推公式如下:
T(n)={nn⩽1T(n−1)+T(n−2)n⩾2 T(n)=\left\{\begin{array}{l}{n} &n\leqslant1\\ {T(n-1)+T(n-2)}&n\geqslant2\end{array}\right. T(n)={nT(n1)+T(n2)n1n2
根据特征方程方法来求解:
对于数列an+2=c1an+1+c2ana_{n+2}=c_{1} a_{n+1}+c_{2} a_{n}an+2=c1an+1+c2an可以构造特征方程x2=c1x+c2x^2=c_1 x+c_{2}x2=c1x+c2,方程解为x1,x2x_1,x_2x1,x2可以得到最终通项公式为:an=px1n+qx2na_{n}=p x_{1}^{n}+q x_{2}^{n}an=px1n+qx2n
那么Fibonacci数列可以得到
x1=1+52x2=1−52x_{1}=\frac{1+\sqrt{5}}{2} \quad x_{2}=\frac{1-\sqrt{5}}{2}x1=21+5x2=215
则有an=p(1+52)n+q(1−52)na_{n}=p\left(\frac{1+\sqrt{5}}{2}\right)^{n}+q\left(\frac{1-\sqrt{5}}{2}\right)^{n}an=p(21+5)n+q(215)n
代入a1=1,a2=1a_{1}=1, a_{2}=1a1=1,a2=1,可得p=15,q=−15p=\frac{1}{\sqrt{5}}, q=-\frac{1}{\sqrt{5}}p=51,q=51
因此有:an=15[(1+52)n−(1−52)n] a_{n}=\frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^{n}-\left(\frac{1-\sqrt{5}}{2}\right)^{n}\right] an=51[(21+5)n(215)n]

2. 线性递归,时间复杂度:O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)
int fib(int n, int prev){
	if (0 == n){
		prev = 1;
		return 0;
	}
	else{
		int prevP; prev = fib(n-1, prevP);
		return prevPrev + prev;
	}
}
2. 迭代,时间复杂度:O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)
int fib(int n){
	int f = 1, g = 0;
	while(0 < n--){
	g += f;
	f = g-f;
	}
	return n
}
3. power2 方法,时间复杂度:O(logn)O(logn)O(logn)

(fib(n)fib(n+1))=(θ111)n(fib(θ)fib(1))=(0111)n(θ1)\left(\begin{array}{c}{f i b(n)} \\ {f_{i b}(n+1)}\end{array}\right)= \left(\begin{array}{ll}{\theta} &amp; {1} \\ {1} &amp; {1}\end{array}\right)^{n}\left(\begin{array}{l}{f_{i b}(\theta)} \\ {f_{i b}(1)}\end{array}\right)= \left(\begin{array}{ll}{0} &amp; {1} \\ {1} &amp; {1}\end{array}\right)^{n}\left(\begin{array}{l}{\theta} \\ {1}\end{array}\right)(fib(n)fib(n+1))=(θ111)n(fib(θ)fib(1))=(0111)n(θ1)
用矩阵的方法,将之前power2()的平方改为矩阵的平方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值