GCD迭代欧几里得算法的时间复杂度

时间:2020-01-28 13:34:59

标签: time-complexity

以下是用于计算mn的最大公约数的欧几里得算法的迭代实现。

while (m != n) 

    { 

        if (m > n) 

            m = m - n; 

        else

            n = n - m; 

    } 

以上代码的时间复杂度是多少?

2 个答案:

答案 0 :(得分:0)

由于我们可以选择m> 1且n = 1,因此最坏的情况至少在n + m中是线性的(因此输入大小呈指数关系),因此该算法可以准确地确定正好m时GCD(m,n)= 1 -1次迭代。这意味着最坏的情况是Omega(m + n)= Omega(2 ^ k),其中k是输入编码中的位数。

最坏的情况最多是m + n线性的(因此输入大小是指数的),因为在每一步中m或n至少减少了1(假设n,m> 0)。因此,循环最多可以迭代m + n次(实际上,它永远不会迭代多次,但是肯定不会迭代更多)。这意味着最坏的情况是O(m + n)= O(2 ^ k),其中k是输入编码中的位数。

因此,最坏的情况是m + n正好是线性的,也就是说,输入k的大小呈指数:它是Theta(m + n)= Theta(2 ^ k)。

当采用数字作为输入的算法的运行时在输入值上是多项式,但在输入编码大小(例如二进制)方面是指数级的,则该算法称为伪多项式时间。

答案 1 :(得分:0)

这里,输入分别是大小为nm的数字log2(n)log2(m)。时间复杂度表示为输入大小的函数。
通常,欧几里得算法的时间复杂度在输入大小上是线性的(例如,检查this answer),但是使用此实现,您将拥有指数级的最坏情况运行时。

假设n>mm=1。这意味着代码如下:

while (m != n) 
    { 
        n = n - m; 
    } 

在最坏的情况下,迭代次数等于n,即输入大小的指数倍。