如何估算Nth Fibonacci元素的后续算法的完成时间?
private static double fib(double nth){
if (nth <= 2) return 1;
else return fib(nth - 1) + fib(nth - 2);
}
答案 0 :(得分:2)
此算法的精确时间复杂度为...... O(F(n))
,其中F(N)为第n个Fibonacci数。为什么?请参阅下面的说明。
让我们通过归纳来证明这一点。显然它适用于基本情况(一切都是常数)。为什么它适用于F(N)?我们将算法复杂度函数表示为T(N)。然后是T(N) = T(N-2) + T(N-1)
,因为你进行了2次递归调用 - 一次参数减少了1,一次减少了2.而这个时间复杂度恰好是斐波纳契数。
所以F(N)
是您可以做出的最佳估算,但您也可以说O(2^n)
或更精确地O(phi^n)
phi = (1 + sqrt(5)) / 2 ~= 1.61
。为什么?因为第n个斐波纳契数几乎等于phi ^ n
。
此边界使您的算法非多项式,对于大于30
周围的数字的数字非常慢。你应该考虑其他好的算法 - 这个问题有许多已知的对数算法。