我注意到1000n或10n的大O与O(n)相同,但2^n和3^n的大O是不同的:O(2^n)和O(3^n),我不理解的是为什么在这种情况下我们不能忽略常数(2或3),是否有任何数学证明可以证明这一点?
由于不存在常数k
的值能够满足不等式3^n <= k * 2^n
对于任意大的n
都成立。因此,f(n) = 3^n
不属于O(2^n)
。
详见http://en.wikipedia.org/wiki/Big_O_notation#Family_of_Bachmann.E2.80.93Landau_notations。
O(3^n) = O(2^n)
这个命题不成立。特别地,使用你上面提到的论证,f(n) = 3^n
在 O(3^n)
中但不在 O(2^n)
中。因此,根据外延公理,这两个集合不相等。 - rliu比较两个复杂度f(n)和g(n),您可以应用极限:lim_{n->\inf} f(n)/g(n),然后有三个可能的答案:
1) lim_{n->\inf} f(n)/g(n) = 0; 这意味着f(n) ∈ O(g(n)),且g(n) ∉ O(f(n))
2) lim_{n->\inf} f(n)/g(n) = +/- inf; 这意味着f(n) ∉ O(g(n)),且g(n) ∈ O(f(n))
3) lim_{n->\inf} f(n)/g(n) ∈ 实数; 这意味着f(n) ∈ O(g(n)),且g(n) ∈ O(f(n))
因此,要证明2^n ∈ O(3^n),您可以按如下操作
lim_{n->\inf} 2^n/3^n = lim_{n->\inf} (2/3)^n = 0
展示了,我们还证明了3^n ∉ O(2^n),很容易看出 2/3 < 1,这使得极限收敛于0,因此极限的结果取决于常数。我的意思是,如果0 < a < 1,则 lim_{n->inf} a^n = 0,如果a > 1,则 lim_{n->inf} a^n = inf;