大O的正式定义中的常量

时间:2014-09-04 04:03:08

标签: algorithm big-o asymptotic-complexity

我正在修改Big O的正式定义以及其他相关的界限,有些事情让我感到沮丧。在我正在阅读的书中(Skiena)Big O被定义为:

f(n)= O(g(n))当存在常数c使得对于n的某个值,f(n)总是<= c * g(n)。 N0

这通常对我有意义。我们只关注n值足够大,以致增长率实际上很重要。但为什么将g(n)乘以c?看起来我可以为c选择一个非常大的值,并通过吹出较小g(n)值的大小来使整个事物变得任意。

次要问题:当选择将算法分类为复杂性类时,一般的经验法则是根据Big O的定义选择仍然保留的最低增长类吗?根据定义,将恒定时间算法分类为O(n!)似乎是有效的,因为f(n)将是&lt; = c * g(n)。当然,这没有任何价值。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将g(n)乘以任意常量c,因为您希望函数只是c因子而不是f(n)。简单来说,您基于n执行分析,而不是常量,因此您关注的是这些函数如何根据输入大小而变化。例如,当您有n^3n时,您无法选择c c*n >= n^3,除非c >= n^2不再是g(n)所以{{1}将f(n)n一起离开{。}}。

正如Ed所说,这种分析不会给你一个确切的运行时间,但增长率取决于输入 n 。如果g(n)f(n)始终只是(最多)相互之间的常数因素,那么两者的增长率都是相同的。

在这种时间复杂度分析中,我们并不关心常数,在大多数情况下确定在某些情况下您实际上应该考虑到它。例如,如果您正在处理小集合,则O(n ^ 2)算法实际上可能比O(nlogn)更快,因为常量。

第二个问题:是的,这是 BigO 的常见问题,您可以使用任意函数,这就是我们通常试图找到“最紧密”g(n)的原因,否则就有了找到它没什么意义。这也是为什么 * BigTheta BigO 更有用的原因,因为它告诉你一个紧束缚,而不是上限。

答案 1 :(得分:1)

  

当选择将算法分类为复杂性类时,根据Big O的定义选择仍然保留的最低增长类是一般的经验法则吗?

就符号而言,就像我们对上界有大O一样,当你能够显示上界和下界匹配时,我们有较大的Omega用于下界和big-Theta。

https://en.wikipedia.org/wiki/Big_O_notation#The_Knuth_definition

假设Knuth引用是正确的,那么我们可以说你并不是唯一一个假设那些涉及紧密渐近界限的结果更有用的东西:)有时候人们会说大O,当他们真的想说大-Theta但是其他一些他们只是不关心或没有设法找到下限。

  

似乎我可以为c选择一个非常大的值,并通过吹出较小g(n)值的大小来使整个事物变得任意。

对于具有不同渐近增长率的函数,c并不重要。无论你选择c有多大或多小,当快速增长的函数赶上时,都会有n。当事物具有相同的增长率时,常数因子允许您忽略常数乘数。例如,当涉及到big-O时,f(x) = 2xg(x) = 3x都具有相同的增长率。