斐波那契数列
斐波那契数列就是在一个数列中,每前两项数数据之和都为第三项数据,这样的数列称之为斐波那契数列。`
使用代码实现斐波那契数列
主要使用的是多路递归的思想实现斐波那契数列
代码示例
public static int f(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return f(n - 1) + f(n - 2);
}
时间复杂度
● 递归的次数也符合斐波那契规律,
2
∗
f
(
n
+
1
)
−
1
2 * f(n+1)-1
2∗f(n+1)−1
● 时间复杂度推导过程
● 斐波那契通项公式
f
(
n
)
=
1
5
∗
(
1
+
5
2
n
−
1
−
5
2
n
)
f(n) = \frac{1}{\sqrt{5}}*({\frac{1+\sqrt{5}}{2}}^n - {\frac{1-\sqrt{5}}{2}}^n)
f(n)=51∗(21+5n−21−5n)
● 简化为:
f
(
n
)
=
1
2.236
∗
(
1.618
n
−
(
−
0.618
)
n
)
f(n) = \frac{1}{2.236}*({1.618}^n - {(-0.618)}^n)
f(n)=2.2361∗(1.618n−(−0.618)n)
● 带入递归次数公式
2
∗
1
2.236
∗
(
1.618
n
+
1
−
(
−
0.618
)
n
+
1
)
−
1
2*\frac{1}{2.236}*({1.618}^{n+1} - {(-0.618)}^{n+1})-1
2∗2.2361∗(1.618n+1−(−0.618)n+1)−1
● 时间复杂度为
Θ
(
1.61
8
n
)
\Theta(1.618^n)
Θ(1.618n)
1 . 更多 Fibonacci 参考[8][9][^10]
2 . 以上时间复杂度分析,未考虑大数相加的因素
Memoization 记忆法
是一种优化技术,通过存储函数调用结果(通常比较昂贵),当再次出现相同的输入(子
问题)时,就能实现加速效果,
代码示例
public static void main(String[] args) {
int n = 13;
int[] cache = new int[n + 1];
Arrays.fill(cache, -1);//使用Arrays类对数组进行初始化
cache[0] = 0;//n=0,结果为0;
cache[1] = 1;//n=1,结果为1;
System.out.println(f(cache, n));
}
public static int f(int[] cache, int n) {
if (cache[n] != -1) {
return cache[n];
}
cache[n] = f(cache, n - 1) + f(cache, n - 2);//将已经得到结果的数据存储到数组
return cache[n];
}
● 改进后的时间复杂度为
O
(
n
)
O(n)
O(n)
注意:
1 . 记忆法是动态规划的一种情况,强调的是自顶向下的解决。
2 . 记忆法的本质是空间换时间。