如果我有一个需要4n ^ 2 + 7n动作才能完成的算法,它的O是什么? O(4N ^ 2)? 为O(n ^ 2)?
我知道7n被切断,但我不知道是否应该保留n ^ 2系数。
由于
答案 0 :(得分:14)
你应该删除任何系数,因为问题实际上是在问“按顺序”,它试图将其表征为线性,指数,对数等...也就是说,当n非常大时,系数是不重要。
这也解释了为什么你放弃+ 7n,因为当n非常大时,该术语对最终答案的意义相对较小。如果你熟悉微积分,你可能会说limn-> inf(4 * n ^ 2 + 7n)〜= lim n-> inf(4 * n ^ 2)〜= lim n-> inf(n ^ 2)
你也可以从图形意义上考虑这个问题......也就是说,如果你将函数4n ^ 2 + 7n绘制为更大和更大的n值,数学家可能会说“它看起来像n ^ 2”。当然,它必须是一个相当自由的数学家,因为这不是一个严格的陈述,但这基本上是O(...)试图传达的。
答案 1 :(得分:11)
系数与Big O表示法无关,因此它只是O(n 2 )。 As Wikipedia explains:
如果我们与任何其他表达顺序进行比较,系数变得无关紧要,例如包含术语n 3 或n 2 的表达式。< / p>
答案 2 :(得分:9)
为了简化(很多),让f
和g
为两个函数f : N -> N
和g : N -> N
。我们说f is O(g)
当且仅当M > 0
为常数|f(n)| < M|g(n)|
时才n > M
,n
。也就是说,非正式地,从f(n)
的大值开始,所有值g(n)
都小于g
的倍数(即f
增长得更快而不是f is O(g) <==> There is K >= 0 such that lim{n -> +oo} |f(n)|/|g(n)| = K
)。
该定义相当于
f(n) = 4n^2 + 7n
所以,我们采取g(n) = n^2
和f is O(g)
,并尝试证明{n -> +oo}
(我将省略lim |f(n)|/|g(n)| = lim f(n)/g(n) = lim (4n^2 + 7n) / n^2 = 4 + lim 7n/n^2 =
= 4 + lim 7/n = 4 + 0 = 4
):
M
这意味着有n > M ==> |f(n)| < M|g(n)|
f is O(g)
,因此4n^2 + 7n is O(4n^2)
。
从技术上讲,说4n^2 + 7n is O(n^3)
是正确的,因为说4n^2 + 7n is O(e^n)
,f is O(e^n)
等是正确的。但要有意义,我们对下限感兴趣。因此,如果f is O(n^2)
和f is O(n^2)
,我们更有兴趣了解{n -> +oo}
,因为这更具限制性。
选择算法时极为重要的是要了解 big-O符号是指渐近情况,也就是说,当你考虑极其难以想象时巨大的输入,远远超出已知宇宙中可用的计算能力(即无限输入集,由{{1}}以数学方式表示)。
对于实际用途(即,不是 so 巨大的输入),在选择算法时,确定,您将观察候选算法 big-O符号,但您必须是确保所选择的算法适合您的(预期)输入(并且表现更好)。
最后,通常表现更好的算法更难以理解和正确实施。在选择算法时你也必须考虑这个事实(即是我将花费调试和修复我的实现的时间远远超过我必须等待另一个算法的时间算法,有一个更糟糕的大O符号?。如果是这样,你应该考虑更简单,效率更低的算法,因为整体解决方案会更有效率。)
答案 3 :(得分:6)
是O(n ^ 2)。常数因素“进入O”。你只保留最大的指数,因为这是一个主导。而且你可以省去系数,因为在比较不同的算法时,甚至非常大的系数导致总数小于具有更大指数(n足够大)的总数。
答案 4 :(得分:4)
像
这样的陈述4n² + 7n = O(n²)
表示对于某个常数乘数c
,表达式cn²
最终会超过4n² + 7n
。将系数留在那里在技术上并不是错误的 - O(n²)
和O(4n²)
意味着完全相同的事情,因为前者的任何常数c
都可以被c/4
取代后者。但是,这样的事情不太清楚,可能会产生误导,而且绝对是非标准的。
答案 5 :(得分:1)
从数学上讲,你会写O(4n²)。这意味着算法的复杂度函数表现为n->4n²,朝向正无穷大。
但是在计算机科学/算法中,你只能写O(n²),这足以对你的算法进行分类。