我需要对Big O做一些澄清

时间:2012-05-28 19:40:02

标签: java

我有几个问题所以请耐心等待。我需要一些帮助来澄清Big O和运行时间。据我所知,Big O是一种表示算法运行时间正确的方法吗?从阅读开始,我一直在试图弄清楚如何计算算法的大O.到目前为止,我已经发现像这样的东西有一个O(N ^ 2)的大O

for(i = 0; i < N, i++)
    for(j = 0; j < N; j++)
      //code

但如果是这样的话会发生什么:

for(i = 0; i < N, i++)
    for(j = 0; j < M; j++)
      //code

其中N不等于M。

如果你将其中两个加在一起,那么大O是什么?

for(i = 0; i < N, i++)
    for(j = 0; j < N; j++)
      //code
for(i = 0; i < N, i++)
    for(j = 0; j < N; j++)
      //code

大O是否等于N ^ 2 + N ^ 2 = 2N ^ 2?

4 个答案:

答案 0 :(得分:4)

  

其中N不等于M。

然后它是O(NM),除非M依赖于N,反之亦然。如果它们是独立的,那么也可以说它是O(N)O(M)

  

大O是否等于N ^ 2 + N ^ 2 = 2N ^ 2?

O(2N^2)相当于O(N^2)

答案 1 :(得分:1)

基本上你是对的。对于第二个,它将是O(N * M)。对于第三个你也是对的但是可以从O(N ^ 2 + N ^ 2)= O(2 * N ^ 2)= O(N ^ 2)减少。

Big oh表示法用于近似算法的运行时间。所以在这种情况下,乘法因子2并不像功率系数那么大,所以我们摆脱了它。

答案 2 :(得分:0)

第二个例子是O(N * M)。第三个仍然是O(N ^ 2),因为常数因子(2)不会改变BigO。重要的是,如果你加倍N,则时间乘以4.如果你加倍N,则时间乘以9.

答案 3 :(得分:0)

对于前两种情况,在这种情况下,要意识到Big-O只是两个变量的函数。如果我告诉你f(x,y) = x + sin y你会说f(x)= f(x) + sin x吗?不,那是胡说八道。

确实是O(N*M)。如果您处于M是固定常数的情况,并且您对程序在N方面的表现感兴趣,那么它在N或O(N)中是线性的。但是有时你会遇到N = M的情况,比如说你正在处理一个正方形,你可以说这个函数是O(N^2)。但对于某些konstant k或M=k没有任何限制,例如M=N,唯一准确的说法就是O(N*M)。如果你告诉我那是二次方,那么我将进行逆向工程并期望N = M或其他东西,如果你告诉我它是线性的,我会期望一个保持不变。

如果你想获得更多的理论,你可以注意到,在指定你正在使用的变量之前,说O(something)始终是胡说八道。f(N,M) = NMO(N) w.r.t. NO(NM) w.r.t N,MO(N^2) w.r.t N where M=N

如果你想得到更多的肮脏......那就是维基百科或math.stackexchange.com:)