(最后有一个 TLDR 专门针对您的问题,我想我也会给您一些关于 big-O 的信息)
也许比形式主义更明显的东西:这个 O 符号的东西应该根据它们的增长来比较函数。如果您根据多项式的增长来比较多项式,那么您只需要查看最高指数(即它们的“度数”):如果它们具有相同的度数,那么它们彼此的增长速度差不多。如果一个人的学历比另一个人高,那么学历高的人比另一个人增长得更快。
因此,从那和一些中学数学中,我们立即知道 2n+5 = O(n^2),因为任何二次函数(n^2 具有正因子)在某些时候都会超过任何线性函数。
现在回到形式主义;我们还想捕捉两个函数增长“大致同样快”的想法。例如,所有正增长的线性函数的增长速度大致相同。为此,我们要引入比例因子 c:如果 f(n) <= c*g(n),我们说 f = O(g)。通过这种缩放,我们立即看到所有线性函数都“大致同样快”地增长:取 f(n) = a*n + b 和 g(n) = k*n + d,然后您可以使用缩放因子重新缩放 g a/k 得到 a/k * g(n) = a*n + d*a/k;所以现在 a/k * g(n) 和 f(n) 增长同样快,它们的绝对差值减小到一个恒定值。
对于线性和二次函数,我们不能这样做;无论我们如何重新调整线性函数,二次函数总是会增长得更快。例如,您可以从它们的衍生物中看到这一点;线性函数的导数是常数,二次函数的导数是线性函数,所以二次函数的增长总是增加而线性函数的增长保持不变。
big-O 定义的最后一部分是关于“对于所有 n > n_0 对于某些 n_0”;我们这样做的原因是因为即使 g 增长得比 f 快,最初 f 可能具有更高的值。例如比较 g(n) = n^2 和 f(n) = n + 2^200。最初,无论你重新缩放多少,f(1) 都将大于 c*g(1)。我们不想打扰这样的事情,所以我们说“如果在某些时候 c*g 高于 f 并保持在它之上,这对我们的目的来说已经足够了”。这就是“(存在 ac 这样)存在 n_0 使得对于所有 n > n_0: f <= c*g” 出现的地方。
现在回到你的问题:你想证明存在 ac 和一个 n_0,这样对于所有 n > n_0,我们有 2n+5 <= c*n^2。现在你必须确定的是 c 是一个数字,而不是一个函数,所以设置 c = 7/n 是不可能的。但是你实际上可以选择一个任意的正 c 看看你是否能解决这个不等式;我将在 c = 3 时展示它:
2n+5 <= 3*n^2
0 <= 3*n^2 - 2n - 5
现在 3*n^2 - 2n - 5 的根是 10/6 和 -1,这意味着在 -1 之前,不等式成立,在 -1 和 10/6 之间,我们低于 0,而在 10/6 之后,不等式再次持有。这意味着我们选择 10/6 之后的第一个自然数作为我们的 n_0,所以我们得到 n_0 = 2。
关于 x^4.2/(1+x^2),对于 x > 1 和 x^4.2,我们得到 0.5*x^2.2 = x^4.2/(2x^2) < x^4.2/(1+x^2) /(1+x^2) < x^4.2/x^2 = x^2.2 对于所有正 x。
对于 x^3 lg x,你就完成了,没有更简单的表达式。您当然可以在不使用对数的情况下给出上限,但实际上并非必须如此。