斐波那契分析 - 这个解决方案是log(n)还是((m(n)* log n))时间复杂度?

时间:2014-09-17 06:31:33

标签: java algorithm big-o time-complexity fibonacci

我最近一直在接受采访,并且遇到了Fibonacci序列问题的计算。我在维基百科Rosetta页面上偶然发现了这个解决方案。他们声称它在O(log(n))时间内计算它。但是,不是O(m(n)* log n),其中m(n)是两个n个数字相乘的时间。我知道它是O(log n)算术运算,但我不相信它也是O(log n)时间。我在这个假设中是正确的还是完全混淆了?有人可以为我澄清一下吗?

以下是代码:

public class fibonacci {

public static long fib(long n) {
    if (n <= 0)
    return 0;

    long i = (int) (n - 1);
    long a = 1, b = 0, c = 0, d = 1, tmp1,tmp2;

    while (i > 0) {
    if (i % 2 != 0) {
          tmp1 = d * b + c * a;
       tmp2 = d * (b + a) + c * b;
       a = tmp1;
       b = tmp2;
    }

        tmp1 = (long) (Math.pow(c, 2) + Math.pow(d, 2));
        tmp2 = d * (2 * c + d);

        c = tmp1;
        d = tmp2;

        i = i / 2;
    }
    return a + b;
}   
}

1 个答案:

答案 0 :(得分:0)

首先,else错过了偶数和奇数的处理。其次,使用幂函数对数字进行平方是不可取的(如在过度杀伤中)。

但总的来说,你是正确的,如果对大整数使用可变数字库,那么多位乘法的成本主要对指定形式的运行时间有贡献。