为什么我们忽略Big O表示法中的系数?

时间:2015-04-29 20:41:28

标签: algorithm big-o time-complexity complexity-theory

在搜索与“Big O”符号相关的答案时,我看到了许多SO答案,例如thisthisthis,但我仍然没有清楚地了解一些分。

为什么我们忽略了效率?

例如this answer表示2N + 2的最终复杂性为O(N);我们也删除了领先的系数2和最终常量2

删除2的最终常量也许是可以理解的。毕竟,N可能会非常大,因此“忘记”最终2可能只会将总计一小部分更改。

但是,我无法清楚地了解如何删除领先的系数没有区别。如果上面的前导2变为13,则总计的百分比变化会很大。

同样,显然2N^3 + 99N^2 + 500O(N^3)。我们如何忽略99N^2以及500

1 个答案:

答案 0 :(得分:0)

数学原因:

我们这样做的真正原因是Big O-Notation的定义方式: 当系列f(n)/ g(n)有界时,一系列(或让我们使用单词函数)f(n)在O(g(n))中。例如:

f(n)= 2 * n ^ 2
g(n)= n ^ 2

f(n)在O(g(n))中,因为当n接近无穷大时,(2 * n ^ 2)/(n ^ 2)= 2。术语(2 * n ^ 2)/(n ^ 2)不会变得无限大(它总是2),因此商是有界的,因此2 * n ^ 2在O(n ^ 2)中。

另一个:

f(n)= n ^ 2
g(n)= n

术语n ^ 2 / n(= n)变得非常大,因为n变为无穷大,所以n ^ 2不在O(n)中。

当你有

时,同样的原则适用

f(n)= n ^ 2 + 2 * n + 20
g(n)= n ^ 2

(n ^ 2 + 2 * n + 20)/(n ^ 2)也是有界的,因为它趋于1,因为n变为无穷大。


Big-O表示法基本上描述了你的函数f(n)是(从n到无穷大的某个值)小于函数g(n),乘以常数。使用前面的示例:

2 * n ^ 2在O(n ^ 2)中,因为我们可以找到值C,因此2 * n ^ 2小于C * n ^ 2。在这个例子中,我们可以选择C为5或10,例如,条件将被满足。

那你从中得到什么呢?如果您知道您的算法具有复杂度O(10 ^ n)并且您输入了4个数字的列表,则可能只需要很短的时间。如果您输入10个数字,则需要一百万倍!如果它长了一百万倍或者长五百万倍并不重要。你总是可以再使用5台计算机并让它在相同的时间内运行,这里真正的问题是,它的输入大小会非常糟糕。