我有以下三种给出Fibonacci数的算法。我想知道如何能够找出它们的复杂性顺序。有谁知道我怎么能确定这个?
Method 1
------------------------------------------------------------------------
long long fibb(long long a, long long b, int n) {
return (--n>0)?(fibb(b, a+b, n)):(a);
}
Method 2
------------------------------------------------------------------------
long long int fibb(int n) {
int fnow = 0, fnext = 1, tempf;
while(--n>0){
tempf = fnow + fnext;
fnow = fnext;
fnext = tempf;
}
return fnext;
}
Method 3
------------------------------------------------------------------------
long long unsigned fib(unsigned n) {
return floor( (pow(PHI, n) - pow(1 - PHI, n))/sqrt(5) );
}
如果我错了,请纠正我,但我的猜测是方法一是O(2^n)
,因为它是递归的,medtod 2将是O(n)
而最后一个将是O(1)
。
答案 0 :(得分:1)
方法1和2具有复杂性O(n)
。原因很简单:
n-1
次,每次递归都执行简单的算术运算。n-1
次,每次迭代都有恒定时间,再次简单数学。方法3确实具有O(1)的复杂度,但可能无法计算正确的值,仅仅是近似值。