GCD代码的时间复杂度

时间:2017-04-02 14:54:05

标签: c time-complexity

我想了解以下代码的时间复杂度:

then

我读到上面代码的复杂性是Θ(logn)。有人可以解释一下它背后的逻辑吗?

1 个答案:

答案 0 :(得分:4)

考虑算法的任何两个步骤。

在某些时候,您的数字(a,b) a> B'/ strong>即可。在第一步之后,这些转向(b,c) c = a mod b ,在第二步之后,两个数字将是(c,d d = b mod c

现在回想一下。由于 d = b mod c ,我们知道某些 k> b = kc + d 0 即可。最小的可能性是 k = 1 ,因此b≥1c+ d = c + d

从该结果和 a> b 我们得到 a> c + d 。如果我们添加我们刚刚导出的最后两个不等式,我们得到(a + b)> 2(c + d)。 换言之,在每两个连续步骤之后,两个数字的总和减少到小于其原始大小的一半。

现在看一下算法的第一步。一开始,我们有一些(a,b) a> B'/ strong>即可。在第一步之后,我们(b,c) c = a mod b ,并且明显 b> ç即可。因此,在第一步之后,两个数字最多等于两个输入数字中的较小者。

将这两个结果放在一起,我们可以得出结论,迭代次数(在其他实现中的递归调用)在较小的输入数中最多是对数。 换句话说,迭代次数在较小输入数字 中的位数最多是线性的。