知道程序递归实现算法的程序员一般都接触过斐波那契数列,即:
F(n)={1,n=1;1,n=2;F(n-1)+F(n-2)}
递归代码如下:
int Fib1(int n)
{
if (n<1)
{
return -1;
}
if (n==1||n==2)
{
return 1;
}
return Fib1(n - 1) + Fib1(n - 2);
}
但是它的时间复杂度是:
请注意,是指数级!
所以,接下来给出优化版实现:
分析:事件复杂度较高的原因是:每次计算n的时候,都要重复计算n-1和n-2,因此增大了事件复杂度,如果事先用数组保存之前的数据,就会减少计算次数:
int Fib2(int n)
{
if (n<1)
{
return -1;
}
int *array = new int[n];
array[0] = 1;
array[1] = 1;
for (int i=2;i<n;i++)
{
array[i] = array[i - 1] + array[i - 2];
}
return array[n-1];
}
上面的代码瞬间将指数级降至O(n)级别,但是有没有更好的算法呢,有的,请继续看:
int Fib3(int n)
{
int a1 = 1;
int a2 = 1;
if (n<1)
{
return -1;
}
if (n==1||n==2)
{
return 1;
}
for (int i=3;i<=n;i++)
{
a2 = a2 + a1;
a1 = a2 - a1;
}
return a2;
}
这样,虽然时间复杂度没有改变,但是空间复杂度再次降低