让我们考虑经典的大O符号定义(proof link):
O(f(n))
是所有函数的集合,因此对于所有C
,都存在带有n0
的正常量|g(n)| ≤ C * f(n)
和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)
更加精确,使我们清楚地知道哪种算法更快。第二个没有显示任何内容。
问题是:为什么没人使用第一个变体?
答案 0 :(得分:4)
从一开始就使用O()
表示法是“精确地”指出相反。这个想法是要掩盖算法之间的“精确”差异,并能够忽略计算硬件细节的影响以及编译器或编程语言的选择。实际上,g_1(n)
和g_2(n)
都属于n
的同一类(或一组),即O(n^2)
类。它们在细节上有所不同,但是足够相似。
这是一堂课,这就是为什么我编辑您的问题并将其表示法从= O(9999 * N^2)
更正为∈ O(9999 * N^2)
的原因。
顺便说一句-我相信您的问题更适合cs.stackexchange.com。