这个函数的大O是什么? def fd(n): x、 y,count1,count2=n,1,0,0 而(x>1):(x,count1)=(x/5,1+count1) 而(y无穷大)是没有意义的。我们也忽略了这样一个事实,即如果输入是一个double,那么它的大小是恒定的,因此算法的复杂性是恒定的(严格地说)O(1)(巨_常数乘以1),巨_常数等于最坏情况下的时间(该常数可能取决于您可以用Python的double表示的最大数) 总结:

这个函数的大O是什么? def fd(n): x、 y,count1,count2=n,1,0,0 而(x>1):(x,count1)=(x/5,1+count1) 而(y无穷大)是没有意义的。我们也忽略了这样一个事实,即如果输入是一个double,那么它的大小是恒定的,因此算法的复杂性是恒定的(严格地说)O(1)(巨_常数乘以1),巨_常数等于最坏情况下的时间(该常数可能取决于您可以用Python的double表示的最大数) 总结:,python,big-o,Python,Big O,让我们看看。第一个循环计算n可以除以5的次数,因此count1是log(n)(O()计算中不计算常数)。然后,第二个循环计算可以将多少次count1(=log(n))添加到1以获得n,因此它基本上循环n次/log(n) 在我看来,这是O(log(n)+(n/log(n))) 正如J.F.塞巴斯蒂安指出的,n/log(n)支配着log(n),所以最终的答案应该是O(n/log(n))。让我们看看。第一个循环计算n可以除以5的次数,因此count1是log(n)(O()计算中不计算常数)。然后,第二

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

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


正如J.F.塞巴斯蒂安指出的,n/log(n)支配着log(n),所以最终的答案应该是O(n/log(n))。

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

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


正如J.F.塞巴斯蒂安所指出的,n/log(n)支配着log(n),所以最终的答案应该是O(n/log(n))。

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

请让我重新表述一下这个答案:

人们用大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受double定义的限制这一事实,因此严格来说,讨论渐近行为(n->无穷大)是没有意义的。我们也忽略了这样一个事实,即如果输入是一个double,那么它的大小是恒定的,因此算法的复杂性是恒定的(严格地说)O(1)(巨_常数乘以1),巨_常数等于最坏情况下的时间(该常数可能取决于您可以用Python的double表示的最大数)

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

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

请让我重新表述一下这个答案:

人们用大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受double定义的限制这一事实,因此严格来说,讨论渐近行为(n->无穷大)是没有意义的。我们也忽略了这样一个事实,即如果输入是一个double,那么它的大小是恒定的,因此算法的复杂性是恒定的(严格地说)O(1)(巨_常数乘以1),巨_常数等于最坏情况下的时间(该常数可能取决于您可以用Python的double表示的最大数)

总结:
正式答案是O(1),但O(exp(N))没有答案那么糟糕,O(N/log(N))也是一个好答案(可能是你真正需要的)。

O(N/log(N))
(同样的事情)@J.F.Sebastian-是的,这是对的,因为N/log(N)支配着log(N)。更新了答案。或
O(N/log(N))
(同样的事情)@是的,这是对的,因为n/log(n)支配log(n)。更新了答案。O(1)?我认为这不是答案。这个函数不需要固定的时间。也许我写得不好,也许我错了。在我看来,也请看我链接到的答案,大O应该取决于输入大小(而不是输入值)。我很高兴我得到了一些反馈,我希望我们可以讨论一下。你通常是正确的,但在这种情况下,输入值是输入大小。请注意,函数随输入发生变化的时间,因此不可能是O(1)。如果我说1023的大小是10,双精度的大小是64,我希望我没有错。(所以输入的大小!=值)。这就是我的意思。我们用三种不同的方式使用单词大小。当你读到“输入的大小”时例如,它们只是指集合中的元素数或其他。当我说大小时,我指的是相同的东西,当我说值时,我指的是
n
等于的数字,在
fd
内。当你说它时,你指的是数字中的位数,与这种情况无关。O(1)?我认为这不是答案。这个函数不需要固定的时间。也许我写得不好,也许我错了。在我看来,也请看我链接到的答案,大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