当大O表示N加倍时的运行时间比率

时间:2013-06-23 14:02:30

标签: algorithm big-o division

我使用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

这是对的吗?或者上述部门无效?

3 个答案:

答案 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,如下所示。

enter image description here

这显然是O(N^2),因为我们可以选择常量p=1T(N) ≤ pN^2足够大N

什么是T(2N)?这是(2N)^2 = 4N^2,如下所示,因为2N始终是偶数。

enter image description here

因此,当T(2N)/T(N)为奇数时4N^2/1 = 4N^2N4N^2/N^2=4为偶数时为N,如下所示。

enter image description here

显然T(2N)/T(N)不是4.但是O(N^2),因为我们可以选择常量q=4T(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)