【发布时间】:2012-11-06 13:28:30
【问题描述】:
我刚刚尝试用各种方法实现代码(用 Java 编写),通过这些方法可以计算斐波那契数列的第 n 项,我希望能验证我所学的内容。
迭代实现如下:
public int iterativeFibonacci(int n)
{
if ( n == 1 ) return 0;
else if ( n == 2 ) return 1;
int i = 0, j = 1, sum = 0;
for ( ; (n-2) != 0; --n )
{
sum = i + j;
i = j;
j = sum;
}
return sum;
}
递归实现如下:-
public int recursiveFibonacci(int n)
{
if ( n == 1 ) return 0;
else if ( n == 2 ) return 1;
return recursiveFibonacci(n-1) + recursiveFibonacci(n-2);
}
记忆的实现如下:-
public int memoizedFibonacci(int n)
{
if ( n <= 0 ) return -1;
else if ( n == 1 ) return 0;
else if ( n == 2 ) return 1;
if ( memory[n-1] == 0 )
memory[n-1] = memoizedFibonacci(n-1);
if ( memory[n-2] == 0 )
memory[n-2] = memoizedFibonacci(n-2);
return memory[n-1]+memory[n-2];
}
在尝试找出这些实现的 Big-O 时,我有点怀疑。我相信迭代实现是 O(n),因为它循环了 N-2 次。
在递归函数中,有重新计算的值,因此我认为它是O(n^2)。
在 memoized 函数中,超过一半的值是基于 memoization 访问的。我读过一个算法是O(log N),如果它需要恒定的时间来将问题空间减少一个分数,而一个算法是O(N),如果它需要恒定的时间以恒定的量减少问题空间。我是否相信 memoized 实现的复杂性是 O(n)?如果是这样,迭代实现不是三者中最好的吗? (因为它不使用记忆所需的额外内存)。
【问题讨论】:
-
编程竞赛中这类线性递归问题通常通过“矩阵求幂”来解决。 blogpost 中有一个斐波那契数列的 C++ 示例。
标签: java algorithm complexity-theory big-o time-complexity