假设
S(n) = Big-Oh(f(n)) & T(n) = Big-Oh(f(n))
两个f(n)
同一属于同一个类。
我的问题是:为什么S(n)/T(n) = Big-Oh(1)
不正确?
答案 0 :(得分:7)
考虑S(n) = n^2
和T(n) = n
。然后,S
和T
都是O(n^2)
,但S(n) / T(n) = n
不是O(1)
。
这是另一个例子。考虑S(n) = sin(n)
和T(n) = cos(n)
。然后S
和T
为O(1)
,S(n) / T(n) = tan(n)
不是O(1)
。第二个例子很重要,因为它表明即使你有一个紧张的界限,结论仍然可能失败。
为什么会这样?因为明显的“证据”完全失败了。明显的“证据”如下。常量C_S
和C_T
以及N_S
和N_T
其中n >= N_S
暗示|S(n)| <= C_S * f(n)
且n >= N_T
暗示|T(n)| <= C_T * f(n)
。让N = max(N_S, N_T)
。那么对于n >= N
我们有
|S(n) / T(n)| <= (C_S * f(n)) / (C_T * f(n)) = C_S / C_T.
这完全是错误的。 |T(n)| <= C_T * f(n)
并不意味着1 / |T(n)| <= 1 / (C_T * f(n))
。事实上,1 / |T(n)| >= 1 / (C_T * f(n))
是真实的。不平等逆转,这表明“定理”存在严重问题。直观的想法是,如果T
是“小”(即有界),则1 / T
是“大”。但我们试图证明1 / T
是“小”而我们就是不能这样做。正如我们的反例所示,“证据”存在致命缺陷。
然而,这里有一个定理是正确的。也就是说,如果S(n)
为O(f(n))
且T(n)
为Ω(f(n))
,则S(n) / T(n)
为O(1)
。上面的“证明”适用于这个定理(感谢Simone将这个想法推广到这个陈述)。
答案 1 :(得分:2)
这是一个反例:
我们说f(n) = n^2
,S(n) = n^2
和T(n) = n
。现在S和T都在O(f(n))
中(您必须记住O(n^2)
是O(n)
的超集,因此O(n)
中的所有内容也在O(n^2)
中),但U(n) = S(n)/T(n) = n^2/n = n
绝对不在O(1)
。
答案 2 :(得分:1)
与其他解释的一样,S(n)/ T(n)通常不是O(1)。
你的怀疑可能源于O和Θ之间的混淆;实际上如果:
S(n) = Θ(n) and T(n) = Θ(n)
然后是以下情况:
S(n) / T(n) = Θ(1) and thus S(n) / T(n) = O(1)
答案 3 :(得分:0)
如果将一些实际功能插入公式中,您可以证明这是错误的,例如
S(n) = n^2
T(n) = n
f(n) = n^2
S(n) / T(n) = n
n != O(1)