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)