我最近一直在接受采访,并且遇到了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;
}
}
答案 0 :(得分:0)
首先,else
错过了偶数和奇数的处理。其次,使用幂函数对数字进行平方是不可取的(如在过度杀伤中)。
但总的来说,你是正确的,如果对大整数使用可变数字库,那么多位乘法的成本主要对指定形式的运行时间有贡献。