为什么我们不喜欢在 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
.
根据此定义,执行以下操作是合法的(g1
和 g2
是描述两种算法复杂度的函数):
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。
让我们考虑一下经典的大 O 符号定义 (proof link):
O(f(n))
is the set of all functions such that there exist positive constantsC
andn0
with|g(n)| ≤ C * f(n)
, for alln ≥ n_0
.
根据此定义,执行以下操作是合法的(g1
和 g2
是描述两种算法复杂度的函数):
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。