我使用Big O表示法了解到了
O(f(n)) + O(g(n)) -> O(max(f(n),g(n))
O( f(n) )* O( g(n)) -> O( f(n) g(n))
但是现在,我有这个等式来表示输入大小N
的运行时间T.T(N) = O(N^2) // O of N square
我需要找到比率T(2N) / T(N)
我试过这个
T(2N) / T(N) --> O((2N)^2) /O( N^2) --> 4
这是对的吗?或者上述部门无效?
答案 0 :(得分:2)
我也会说这是不正确的。我的直觉是,如果T(N)
为O(N^2)
,则T(2N)/T(N)
为O(1)
,与您T(2N)/T(N) = 4
的建议一致。但我认为直觉是错误的。
考虑一个反例。
如果T(N)
为奇数,则N
为1,如果N^2
为偶数则为N
,如下所示。
这显然是O(N^2)
,因为我们可以选择常量p=1
,T(N) ≤ pN^2
足够大N
。
什么是T(2N)
?这是(2N)^2 = 4N^2
,如下所示,因为2N
始终是偶数。
因此,当T(2N)/T(N)
为奇数时4N^2/1 = 4N^2
为N
,4N^2/N^2=4
为偶数时为N
,如下所示。
显然T(2N)/T(N)
不是4.但是O(N^2)
,因为我们可以选择常量q=4
,T(2N)/T(N) ≤ qN^2
足够大N
以下图表的R代码
x=1:50
t1=ifelse(x%%2, 1, x^2)
plot(t1~x,type="l")
x2=2*x
t2=ifelse(x2%%2, 1, x2^2)
plot(t2~x,type="l")
ratio=t2/t1
plot(ratio~x,type="l")
这个问题很有意思,让我觉得属于纯数学领域,即序列的限制等。我没有接受纯数学方面的训练,我会因为声称T(2N)/T(N)
总是 O(N^2)
而感到紧张,因为有可能发明一些相当曲折的反例。
答案 1 :(得分:1)
即使T(N)=Θ(N²)(big-theta),这也不起作用。 (我甚至不打算谈论大O.)
c1 * N² <= T(N) <= c2 * N²
c1 * 4 * N² <= T(2N) <= c2 * 4 * N²
T(N) = c_a * N² + f(N)
T(2N) = c_b * 4 * N² + g(N)
对于c_a和c_b,介于c1和c2之间,f(N)和g(N)小于o的N 2。 (感谢G. Bach!)并且没有什么能保证商数等于4,因为c_a,c_b,f(N)和g(N)都可以是各种各样的东西。例如,取c_a = 1,c_b = 2和f(N)= g(N)= 0.除以它们就得到了
T(2N)/T(N) = (2 * 4 * N²)/N² = 8
答案 2 :(得分:0)
好问题!
这是不正确的。
运行时间与时间复杂度(此处为大O)不同。时间复杂度表示,如果运行时间不能更长,则恒定时间 N ^ 2 。运行时间可以是非常不同,可能非常低,可能接近渐近极限。这纯粹取决于隐藏的常数。如果有人问你这个问题,这是一个技巧问题。
隐藏常数是指执行的原始指令的实际数量。因此,在这种情况下,操作总数可以是:
5*N^2
或
1000*N^2.
或者
100*N^2+90N
或者只是
100*N (Recall this is also O(N^2))
因素取决于实施和实际执行的指令。这可以从算法中找到。 所以无论哪种情况,我们只是说Big-O是 O(N ^ 2)。