以下是用于计算m
和n
的最大公约数的欧几里得算法的迭代实现。
while (m != n)
{
if (m > n)
m = m - n;
else
n = n - m;
}
以上代码的时间复杂度是多少?
答案 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)
这里,输入分别是大小为n
和m
的数字log2(n)
和log2(m)
。时间复杂度表示为输入大小的函数。
通常,欧几里得算法的时间复杂度在输入大小上是线性的(例如,检查this answer),但是使用此实现,您将拥有指数级的最坏情况运行时。
假设n>m
和m=1
。这意味着代码如下:
while (m != n)
{
n = n - m;
}
在最坏的情况下,迭代次数等于n
,即输入大小的指数倍。