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

Why do we prefer not to specify the constant factor in Big-O notation?

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

O(f(n)) is the set of all functions such that there exist positive constants C and n0 with |g(n)| ≤ C * f(n), for all 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) 相比更精确,并且让我们清楚地了解哪种算法更快。第二个没有向我们展示任何东西。

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

O() 符号的使用从一开始就与注释 "precisely" 相反。这个想法是为了掩盖 "precise" 算法之间的差异,以及能够忽略计算硬件细节的影响以及编译器或编程语言的选择。实际上,g_1(n)g_2(n) 都在 class(或集合)n 的相同函数中 - class O(n^2)。它们在细节上有所不同,但它们足够相似。

它是 class 的事实是我编辑您的问题并将符号从 = O(9999 * N^2) 更正为 ∈ O(9999 * N^2) 的原因。

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