O(n^3) 真的比 O(2^n) 更有效率吗?

Is O(n^3) really more efficient than O(2^n)?

我的算法class的作业声称 O(n3) 比 O(2n 更有效).

当我将这些函数放入图形计算器时,f(x)=2x 对于非常大的 n(从 n = 982 左右开始)似乎始终更有效.

考虑到对于函数 f(n) = O(g(n)),对于所有大于某些 n0 的 n,它必须更小,这不是吗意味着从 n = 982 我们可以说 O(2n) 更有效?

你混淆了 O(2n) 和 2n。 O(2n) 实际上是 C*2n,其中 C 是任意选择的正常数。同样,O(n3) 是 D*n3,其中 D 是另一个任意选择的正常数。声明 "O(n3) is more efficient than O(2n)" 意味着,给定任何固定的 C 和 D,总是可以找到这样的 n0 对于任何 n >= n0, D*n3 < C*2n.

2^n 的增长速度比 n^3 快得多。也许您在计算器或类似的东西中输入了错误的值。另请注意,更高效 意味着 更少时间 这意味着 较低的值 y-axis .

让我向您展示这些函数的一些正确图(使用 Wolfram Alpha):

首先 2^n 更小(但只是一个很小的范围),之后 你可以看到 2^n 如何超越它。

经过这次交集,情况再也没有改变,2^n 仍然远远大于 n^3。这也适用于您分析的范围,因此 > 982,如下图所示(n^3 的图靠近 x-axis):


另请注意,在 Big-O-Notation 中,我们总是根据函数的增长来比较函数。这就是为什么像 O(n^3) 不包含函数 f : f(x) <= n^3 而是 f : f(x) <= C * n^3 的原因,其中 C 是一个任意常数,它可能很大,也可能很小。这说明了比较中的 增长因子 。另请注意,允许条件在有限数量的 x 中不成立,但在条件成立的地方必须存在一些界限 x',因此对于每个 x > x'.

将此解释与 Wikipedia 中的完整数学定义进行比较,其中 Ckxnx'n_0:

如果为真,则定义 f(n) 在集合 O(g(n)) 中。