我想了解以下代码的时间复杂度:
then
我读到上面代码的复杂性是Θ(logn)。有人可以解释一下它背后的逻辑吗?
答案 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> ç即可。因此,在第一步之后,两个数字最多等于两个输入数字中的较小者。
将这两个结果放在一起,我们可以得出结论,迭代次数(在其他实现中的递归调用)在较小的输入数中最多是对数。 换句话说,迭代次数在较小输入数字 中的位数最多是线性的。