这个功能的大O是什么?

时间:2012-10-18 03:32:23

标签: python big-o

def fd(n):
    x,y,count1,count2 = n,1,0,0
    while (x > 1): (x,count1) = (x/5,1+count1)
    while (y < n): (y,count2) = (count1+y,1+count2)
    return count2

2 个答案:

答案 0 :(得分:9)

我们来看看。第一个循环计算n可以除以5的次数,因此count1是log(n)(常量不计入O()计算)。然后第二个循环计算count1(= log(n))可以添加到1到n的次数,因此它基本上循环n / log(n)次。

在我看来,这是O(log(n)+(n / log(n)))。

正如J.F. Sebastian指出的那样,n / log(n)在log(n)中占主导地位,所以最终的答案应该是O(n / log(n))。

答案 1 :(得分:0)

我想指出,这个问题的答案取决于对我们所谈论的内容的一致意见(重要的是双重数字将被操纵的事实吗?你想要理论上的答案听起来不能令人满意吗?实际答案?)

请让我重新解释一下这个答案:https://stackoverflow.com/a/2027842/512225

人们用大O符号快速松散地播放。

算法复杂度,因此大O符号,应根据输入的位大小来表示,而不是根据输入的值来说明。假设二进制输入和任意大数,并且N是输入的位数,N = log(n)。 复杂度是O(exp(N)/ N)= O(exp(N)/ N),因为第二循环需要n / log(n)步长= exp(N)/ N步。

在实践中,谈论复杂性是有意义的,好像N是输入本身,而不是输入的大小。在这种情况下,函数的复杂性为n / log(n)。

无论如何,我们无视n由双重定义限制的事实所给出的问题,因此严格来说,谈论渐近行为(使用n - >无穷大)是没有意义的。我们也忽略了这样一个事实:如果你的输入是双倍的,它的大小是恒定的,因此你的算法的复杂性(严格地说)是O(1)(huge_constant次1),其中huge_constant等于最坏情况时间(可能是常量)取决于你用Python的双打表达的最大数字)。

汇总:

正式答案是O(1)但是O(exp(N))并不是那么糟糕的答案,O(n / log(n))也是一个很好的答案(可能你真正需要的)。