用于计算数字平方根的这种特殊(坏)算法的渐近复杂度是多少?

时间:2016-04-20 05:54:26

标签: algorithm asymptotic-complexity

偶然发现了一个用于计算数字平方根的(可怕)算法。关于时间复杂性的一个小论点。我断言时间复杂度为O(n ^ 2),因为对于n输入,它将乘以n次。我的朋友声称时间复杂度实际上是O(n)。谁是对的,为什么?

def squareRoot(x):
if x<0:
    return "undefined"
elif x==0:
    return 0
for i in range(0,x):
    if(i*i)==x:
        return i

3 个答案:

答案 0 :(得分:1)

这是O(n),因为在最坏的情况下,你执行x次乘法和测试,所以你的计算时间随你的输入呈线性增长。

答案 1 :(得分:0)

首先我们需要知道整数乘法的复杂性是什么。

为简单起见,我们将使用Schönhage–Strassen algorithm 。对于带有n位数的数字,复杂度为O(n log n log log n)

当然,数字n实际上有O(log n)个数字,因此要将数字n的数字相乘,时间复杂度为O(log n log log n log log log n)

最多n个n个数量要乘以,所以总体来说是O(n log n log log n log log log n)

因此O(n^2)更正确,与O(n!)正确的方式相同。正确但无益。并且O(n)是完全错误的,没有做出几个假设。

请注意,使用更好的乘法算法可以做得更好。

答案 2 :(得分:0)

让我们首先看看这个算法是如何运作的。

在最坏的情况下,即x不是正方形,x是素数,时间复杂度为O(n)。
在最好的情况下。那是不。是完美的正方形,那么它将按照SQRT(n)的顺序排列。