Java 如何估计第n个元素的斐波那契递归算法的时间?

Java 如何估计第n个元素的斐波那契递归算法的时间?,java,algorithm,Java,Algorithm,如何估计第n个Fibonacci元素的后续算法的完成时间 private static double fib(double nth){ if (nth <= 2) return 1; else return fib(nth - 1) + fib(nth - 2); } private静态双fib(双n){ 如果(n此算法的精确时间复杂度是…O(F(n))其中F(n)是n个斐波那契数。为什么?请参见下面的解释 让我们通过归纳来证明它。显然它适用于基

如何估计第n个Fibonacci元素的后续算法的完成时间

private static double fib(double nth){

        if (nth <= 2) return 1;
        else return fib(nth - 1) + fib(nth - 2);
    }
private静态双fib(双n){

如果(n此算法的精确时间复杂度是…
O(F(n))
其中F(n)是n个斐波那契数。为什么?请参见下面的解释

让我们通过归纳来证明它。显然它适用于基本情况(一切都是常数)。为什么它适用于F(N)?让我们将算法复杂度函数表示为T(N)。然后
T(N)=T(N-2)+T(N-1)
,因为您进行了两次递归调用—一次参数减少1,一次参数减少2。而这个时间复杂度正是斐波那契序列

所以
F(N)
是你能做的最好的估计,但你也可以说这是
O(2^N)
或者更精确地说
O(phi^N)
其中
phi=(1+sqrt(5))/2~=1.61
。为什么?因为N菲波纳契数几乎等于
phi^N


这个绑定使你的算法非多项式,而且比在代码> 30 附近的数字要慢很多。你应该考虑其他好的算法——这个问题有很多对数算法。

你是指复杂度?还是实际时间?算法运行在<代码> O(φ^ n)< /代码>时间。我需要实际时间。(计算第n个元素需要多长时间)。例如,如何计算第200个斐波那契数的O(φ^n)?对元素1..10运行它,然后使用
O(φ^2)的事实进行推断
。这不太准确。这是一个练习吗?是的。我在6452毫秒内得到了第45个;在1毫秒内得到了第10个。如何计算第200个的时间?为什么不使用?如果第10个元素是在1毫秒内计算的,我如何用我的算法计算出找到第300个fib元素所需的时间?根据上面的公式,你需要大约2*10^62次运算ns.假设你的计算机在一个内核上每秒可以进行10^9次运算,你将需要10^45年。地球和太阳将在这之前消亡。@RCola你需要使用
System.nanoTime()
来计算运行时间。
System.currentTimeMillis()
不够准确。@Boristeider,我希望你是在开玩笑吧?他需要等10^45年。不,最好说c*(1.61^10)=9193461。你必须找到c*(1.61^30)。这很容易找到,因为c*(1.61^10)=c*(1.61^10)^3=c*(9193461)^3