gcd算法时间复杂度

时间:2020-08-04 09:13:48

标签: algorithm math time-complexity greatest-common-divisor

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定理来找到时间复杂度类?

2 个答案:

答案 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)(基数无关紧要)