这里进行的数学运算如下。当你说 O(n(n + n2)) 时,这相当于通过简单地分配说 O(n2 + n3)整个产品中的 n。
O(n2 + n3) = O(n3) 的原因来自 big-O 的正式定义符号,如下:
一个函数 f(n) = O(g(n)) 如果存在常数 n0 和 c 使得对于任何 n ≥ n0,|f (n)| ≤ c|g(n)|。
通俗地说,这表示随着 n 变得任意大,f(n) 从上方以 g(n) 的恒定倍数为界。
为了正式证明 n2 + n3 是 O(n3),考虑任何 n ≥ 1。那么我们有
n2 + n3 ≤ n3 + n3 = 2n3支持>
所以我们有 n2 + n3 = O(n3),其中 n0 = 1 和 c = 2。因此,我们有
O(n(n + n2)) = O(n2 + n3) = O(n 3).
要真正正式地说明这一点,我们需要证明如果 f(n) = O(g(n)) 且 g(n) = O(h(n)),则 f(n) = O (h(n))。让我们来看一个证明。如果 f(n) = O(g(n)),则存在常数 n0 和 c,使得对于 n ≥ n0,|f(n)| ≤ c|g(n)|。类似地,由于 g(n) = O(h(n)),有常数 n'0, c' 使得对于 n ≥ n'0,g( n) ≤ c'|h(n)|。所以这意味着对于任何 n ≥ max(c, c'),我们有这个
|f(n)| ≤ c|g(n)| ≤ c|c'h(n)| = c x c' |h(n)|
所以 f(n) = O(h(n))。
更准确地说,在此处描述的算法的情况下,作者说运行时是 Θ(n3),这比说运行时更强的结果是 O(n3)。 Θ 表示法表示严格的渐近界,这意味着运行时间以与 n3 相同的速率增长,而不仅仅是它从上面以 n3 的某个倍数为界。为了证明这一点,您还需要证明 n3 为 O(n2 + n3)。我将把这个作为练习留给读者。 :-)
更一般地说,如果您有 any 阶 k 多项式,则该多项式使用类似的参数为 O(nk)。要看到这一点,让 P(n) = ∑i=0k(aini)。然后,对于任何 n ≥ 1,我们有这个
∑i=0k(aini) ≤ ∑i=0 k(aink) = (∑i=0k(ai))nk
所以 P(n) = O(nk).
希望这会有所帮助!