int gcd(int a, int b){
if (a==b) return (a);
else
{
if (a > b) return (gcd(b, a-b));
else return (gcd(a, b-a));
}
}
我发现该算法的复杂度为T(n)= 2T(n-1)+5正确吗?如果可以的话,如何应用Master定理来找到时间复杂度类?
答案 0 :(得分:0)
您没有定义n
,并且算法的时间复杂度不取决于单个参数。
例如,假设n = max(a, b)
,我们有
T(a, a) = O(1)
T(a, 1) = O(n).
答案 1 :(得分:-1)
这种算法的复杂度是T(n)= 2T(n-1)+5正确吗?
不,不是。正如您的公式所暗示的那样,您只有一个递归调用,并且不能将问题分为两个较小的问题。
您不能使用主定理,当您拥有T(n)=aT(n-1)+f(n)
之类的东西时,您需要使用T(n)=aT(n/b)+f(n)
。因此,您必须在每次递归调用时将问题大小除以相同的值。
对于此版本,时间复杂度为O(n)
,其中n = max(a,b)
或n=a+b
。最糟糕的情况是,当您输入gcd(n,n+1)
或gcd(1,n)
时,您只需减去1
n-1
次。
在最佳情况下(输入不相同),您输入两个连续的斐波那契数,那么您将得到对数复杂度。 减法版本的最佳情况与euclids算法的模数版本的最坏情况相同。实际上,在这种情况下,它们之间没有区别。
具有模数的Euclids算法的时间复杂度为O(log(n))
,其中n = max(a,b)
或n=a+b
。
当您查看斐波那契数时,您会得到这种复杂性。对于这种算法,它们是最坏的情况,并且呈指数增长。 Euclids算法遍历此数字(向后,方向无关紧要),因此复杂度是指数函数的倒数,因此log(n)(基数无关紧要)