Time complexity 为什么我们不喜欢在Big-O符号中指定常量因子? 让我们考虑经典的大O符号定义():

Time complexity 为什么我们不喜欢在Big-O符号中指定常量因子? 让我们考虑经典的大O符号定义():,time-complexity,big-o,constants,complexity-theory,Time Complexity,Big O,Constants,Complexity Theory,O(f(n))是所有函数的集合,使得存在正常数C和n0和|g(n)|≤ C*f(n),适用于所有n≥ n\u 0 根据该定义,执行以下操作是合法的(g1和g2是描述两种算法复杂性的函数): 同时,注意以下功能也是合法的: g1(n) = 9999 * N^2 + N ∈ O(n^2) g2(n) = 5 * N^2 + N ∈ O(n^2) 正如您所看到的,第一个变量O(9999*N^2)vs(5*N^2)更精确,并让我们清楚地看到哪个算法更快。第二个没有向我们展示任何东西 问题是:为什么没

O(f(n))
是所有函数的集合,使得存在正常数
C
n0
|g(n)|≤ C*f(n)
,适用于所有
n≥ n\u 0

根据该定义,执行以下操作是合法的(
g1
g2
是描述两种算法复杂性的函数):

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

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

g2(n) = 5 * N^2 + N ∈ O(n^2)
正如您所看到的,第一个变量
O(9999*N^2)
vs
(5*N^2)
更精确,并让我们清楚地看到哪个算法更快。第二个没有向我们展示任何东西

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

从一开始,使用
O()
表示法与“精确地”记下某物正好相反。其目的就是掩盖算法之间的“精确”差异,同时能够忽略计算硬件细节和编译器或编程语言选择的影响。实际上,
g_1(n)
g_2(n)
都属于
n
-类
O(n^2)
的同一类函数(或函数集)。它们在细节上有所不同,但它们足够相似

这是一个类,这就是为什么我编辑了你的问题,并将符号从
=O(9999*N^2)
改为
∈ O(9999*N^2)

顺便说一句-我相信你的问题会更适合。

使用
O()
表示法从一开始就与“精确地”记东西相反。其目的就是掩盖算法之间的“精确”差异,同时能够忽略计算硬件细节和编译器或编程语言选择的影响。实际上,
g_1(n)
g_2(n)
都属于
n
-类
O(n^2)
的同一类函数(或函数集)。它们在细节上有所不同,但它们足够相似

这是一个类,这就是为什么我编辑了你的问题,并将符号从
=O(9999*N^2)
改为
∈ O(9999*N^2)


顺便说一句,我相信你的问题会更适合。

你说:`与“精确地”记录某件事相反,`这是否意味着在复杂度分析中使用大O的主要目标只是确定函数的类别,就这样?@NoNameQA:是的。使用
O()
分析,您希望捕获对参数的定性依赖,而不是细节。您能否提供有关此语句的一些证明链接(本书会更好):
您希望捕获对参数的定性依赖,而不是细节
?顺便说一句,关于您对我问题的更正。我使用
=
符号,因为我原来的问题中有证明链接。是的,大O是一个集合,是
是一个很好的标志。但是现在我们应该使用(不幸的是)
=
符号。@NoNameQA:好吧,让我问你:9999N符号什么时候起作用?也就是说,
g1(n)
所用的单位是什么?你说:`与“精确地”记录某个事物相反',这是否意味着在复杂度分析中使用大O的主要目标只是确定函数的类,就是这样?@NoNameQA:是的。使用
O()
分析,您希望捕获对参数的定性依赖,而不是细节。您能否提供有关此语句的一些证明链接(本书会更好):
您希望捕获对参数的定性依赖,而不是细节
?顺便说一句,关于您对我问题的更正。我使用
=
符号,因为我原来的问题中有证明链接。是的,大O是一个集合,是
是一个很好的标志。但是现在我们应该使用(不幸的是)
=
符号。@NoNameQA:好吧,让我问你:9999N符号什么时候起作用?也就是说,给定的
g1(n)
的单位是什么?更多的是关于如果您增加项目数量(n=1 vs n=1000 vs n=1000000),您可以从函数中得到什么。如果要绘制函数,可以清楚地将其分类为抛物线(几何图形)。
n
没有太大变化,而
9999
也没有太大变化。如果您增加项目数量(n=1 vs n=1000 vs n=1000000),则更多的是关于您可以从函数中获得什么。如果要绘制函数,可以清楚地将其分类为抛物线(几何图形)。
n
与此没有太大变化,
9999
也没有太大变化。
g1(n) = 9999 * N^2 + N ∈ O(n^2)

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