我的算法类的作业声称O(n 3 )比O(2 n )更有效。
当我将这些函数放入图形计算器时,对于非常大的n(从n = 982左右开始),f(x)= 2 x 似乎始终更有效。
考虑到对于函数f(n)= O(g(n)),对于大于某些n 0 的所有n,它必须更小,这不意味着从n = 982我们可以说O(2 n )效率更高?
答案 0 :(得分:9)
2^n
的增长速度比n^3
快得多。也许你已经在计算器中输入了错误的值或类似的东西。另请注意,效率更高意味着更短的时间,这意味着y-axis
上的更低的值。
让我向您展示一些正确的图表(使用Wolfram Alpha):
首先 2^n
更小(但只是一个小范围),之后你可以看到{{1>超越它。
在此交叉点之后,情况永远不会再次发生变化,2^n
仍然非常大于2^n
。这也适用于您分析的范围,因此> 982 ,如下图所示(n^3
的情节靠近n^3
):
另请注意,在 Big-O-Notation 中,我们总是根据功能的增长来比较功能。这就是为什么像x-axis
这样的东西不包含函数O(n^3)
而是f : f(x) <= n^3
,其中f : f(x) <= C * n^3
是一个任意常量,它可能很大,可能很小。这说明了比较中的增长因子。还要注意,允许条件不适用于有限数量的C
但是条件必须存在一些绑定x
,因此对于每个x'
。< / p>
将此解释与Wikipedia的完整数学定义进行比较,其中x > x'
为C
,k
为x
且n
为{{ 1}}:
如果设置为x'
,则n_0
定义为f(n)
。
答案 1 :(得分:2)
你混淆O(2 n )和2 n 。 O(2 n )实际上是C * 2 n ,其中C是任意选择的正常数。同样,O(n 3 )是D * n 3 ,其中D是另一个任意选择的正常数。声明&#34; O(n 3 )比O(2 n )&#34;更有效。意味着,给定任何固定的C和D,总是可以找到这样的n 0 ,对于任何n> = n 0 ,D * n 3 &LT; C * 2 名词