我正在修订Big O和其他相关边界的正式定义,但有些事情让我困扰。在我正在阅读的书(Skiena)中,Big O被定义为:
当存在常数c使得f(n)总是<= c*g(n)时,f(n) = O(g(n)),其中n > n0
这通常对我来说很有意义。我们只关心足够大的n值,以便增长速率真正有影响。但是为什么要将g(n)乘以c呢?似乎我可以选择一个非常大的c值,并通过扩大较小的g(n)值的大小来使整个过程变得任意。
次要问题:在选择将算法分类为复杂度类时,一般的经验法则是只选择最低的增长类,而仍然符合Big O的定义吗?根据定义,将常量时间算法分类为O(n!)似乎是有效的,因为f(n)将<= c*g(n)。当然,这并没有提供任何价值。
谢谢!
c
只是其中一个轴的拉伸值。不会改变图形的形状。 - Ed Heal