以下功能的Big-O运行时间是多少?解释
static int fib(int n){
if (n <= 2)
return 1;
else
return fib(n-1) + fib(n-2)
}
另外,如何以更快的Big-O运行时间迭代地重写fib(int n)函数? 这是O(n)的最佳方式:
public static int fibonacci (int n){
int previous = -1;
int result = 1;
for (int i = 0; i <= n; ++i)
{
int sum = result + previous;
previous = result;
result = sum;
}
return result;
}
}
答案 0 :(得分:4)
<强>证明强>
您可以将时间函数建模为Fib(n)
,以计算Fib(n-1)
的时间加上计算Fib(n-2)
的时间加上将它们加在一起的时间(O(1)
)
T(n<=1) = O(1)
T(n) = T(n-1) + T(n-2) + O(1)
你解决了这种递归关系(例如使用生成函数),你最终会得到答案。
或者,您可以绘制递归树,其深度为n
并直观地确定此函数是渐近O(2
n
{{1 }}。然后,您可以通过归纳证明您的猜想。
基地:)
很明显
假设n = 1
T(n-1) = O(2
n-1
,因此
)
等于
T(n) = T(n-1) + T(n-2) + O(1)
T(n) = O(2
n-1
) + O(2
n-2
) + O(1) = O(2
功能 n
迭代版
请注意,即使这个实现仅适用于n的小值,因为Fibonacci函数呈指数增长,而32位有符号Java整数只能容纳前46个Fibonacci数
)