这个问题引发了一些困惑和许多关于各种答案中提出的算法是 O(1) 还是 O(n) 的评论。
我们用一个简单的例子来说明这两种观点:
我们想找到一个 long
x
,使得a * x + b = 0
,在哪里a
和b
是已知的,非空 long。
- 一个明显的 O(1) 算法是
x = - b / a
- 一个更慢的算法将包括测试每个可能的长值,平均慢约 2^63 倍。
第二种算法是 O(1) 还是 O(n)?
链接问题中提出的论点是:
- 它是 O(n),因为在最坏的情况下,您需要遍历所有可能的 long 值
- 它是 O(1) ,因为它的复杂性是
c x O(1)
,其中c = 2^64
是一个常数。
虽然我理解说它是 O(1) 的论点,但感觉违反直觉。
ps:我添加了java,因为原始问题是Java,但这个问题与语言无关。