【问题标题】:Fibonacci analysis - Is this solution in log(n) or ((m(n) *log n)) time complexity?斐波那契分析 - 这个解决方案是 log(n) 还是 ((m(n) *log n)) 时间复杂度?
【发布时间】:2014-11-11 02:06:19
【问题描述】:

我最近一直在准备面试,偶然发现了斐波那契数列的计算问题。我在 Wikipedia 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;
}   
}

【问题讨论】:

  • 我怀疑两个数字的乘积可以看作是一个常数,这意味着它保持 O(log(n))。
  • @NahuelIanni - 你选对了。 :)
  • 乘法运算作用于具有有限表示(不取决于 n)的数字,因此在您的情况下算术运算是常数时间。
  • @EvanKnowles,网络用户:但是第 n 个斐波那契数的表示的长度取决于 n,尤其是超过所有固定长度格式。此参数仅对模 Fib 数的计算有效。

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


【解决方案1】:

首先有一个else 缺少对偶数和奇数的处理。其次,不建议使用幂函数对数字求平方(如矫枉过正)。

但总的来说你是对的,如果你对大整数使用可变数字库,那么多位乘法的成本基本上会影响指定形式的运行时间。

【讨论】:

    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多