在搜索与“Big O”符号相关的答案时,我看到了许多SO答案,例如this,this或this,但我仍然没有清楚地了解一些分。
为什么我们忽略了效率?
例如this answer表示2N + 2
的最终复杂性为O(N)
;我们也删除了领先的系数2
和最终常量2
。
删除2
的最终常量也许是可以理解的。毕竟,N
可能会非常大,因此“忘记”最终2
可能只会将总计一小部分更改。
但是,我无法清楚地了解如何删除领先的系数没有区别。如果上面的前导2
变为1
或3
,则总计的百分比变化会很大。
同样,显然2N^3 + 99N^2 + 500
是O(N^3)
。我们如何忽略99N^2
以及500
?
答案 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台计算机并让它在相同的时间内运行,这里真正的问题是,它的输入大小会非常糟糕。