大O用于有限的,固定大小的可能值集合

ass*_*ias 4 java language-agnostic algorithm big-o

这个问题引发了一些混乱,并且很多评论关于在各种答案中提出的算法是O(1)还是O(n).

让我们用一个简单的例子来说明两个观点:

我们希望找到一个长期x这样a * x + b = 0,在ab已知的,非空多头.

  • 一个明显的O(1)算法是 x = - b / a
  • 一个慢得多的算法将包括测试每个可能的长值,平均约为2 ^ 63倍.

第二个算法是O(1)还是O(n)?

相关问题中提出的论点是:

虽然我理解说它是O(1)的论点,但感觉反直觉.

ps:我添加了,原始问题是Java,但这个问题与语言无关.

JB *_*zet 7

只有存在变量N时,复杂性才有意义.因此,问题没有任何意义.如果问题是:

一个慢得多的算法将包括在N个值范围内测试每个可能的值,平均值将慢大约N倍.

第二个算法是O(1)还是O(N)?

然后答案是:这个算法是O(N).


Pao*_*olo 5

Big O描述了算法的性能如何随着输入大小n的缩放而缩放.换句话说,当您在更多输入数据上运行算法时.

在这种情况下,输入数据是固定大小,因此两种算法都是O(1),尽管具有不同的常数因子.

如果你用"n"表示数字中的位数(即你删除了64位长的限制),那么你可以分析给定的位大小n算法如何缩放.

在这种情况下,第一个仍然是O(1) (参见Qnan的评论),但第二个现在是O(2 ^ n).

我强烈建议您观看麻省理工学院"算法导论"课程的早期讲座.它们是Big O(和Big Omega/Theta)的一个很好的解释,尽管我们很好地掌握了数学.

  • 实际上,对于可变数量的位,除法也需要一些时间,因此第一个也不会真正为O(1),可能是O(n ^ 2) (2认同)