【发布时间】: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