为什么我们不想在Big-O表示法中指定常数因子?

时间:2018-10-23 14:53:17

标签: time-complexity big-o constants complexity-theory

让我们考虑经典的大O符号定义(proof link):

  

O(f(n))是所有函数的集合,因此对于所有C,都存在带有n0的正常量|g(n)| ≤ C * f(n)n ≥ n_0

根据此定义,进行以下操作是合法的(g1g2是描述两种算法复杂度的函数):

g1(n) = 9999 * n^2 + n ∈ O(9999 * n^2)

g2(n) = 5 * n^2 + N ∈ O(5 * n^2)

注意以下功能也是合法的:

g1(n) = 9999 * N^2 + N ∈ O(n^2)

g2(n) = 5 * N^2 + N ∈ O(n^2)

如您所见,第一个变体O(9999*N^2)(5*N^2)更加精确,使我们清楚地知道哪种算法更快。第二个没有显示任何内容。

问题是:为什么没人使用第一个变体?

1 个答案:

答案 0 :(得分:4)

从一开始就使用O()表示法是“精确地”指出相反。这个想法是要掩盖算法之间的“精确”差异,并能够忽略计算硬件细节的影响以及编译器或编程语言的选择。实际上,g_1(n)g_2(n)都属于n的同一(或一组),即O(n^2)类。它们在细节上有所不同,但是足够相似。

这是一堂课,这就是为什么我编辑您的问题并将其表示法从= O(9999 * N^2)更正为∈ O(9999 * N^2)的原因。

顺便说一句-我相信您的问题更适合cs.stackexchange.com