我有几个问题所以请耐心等待。我需要一些帮助来澄清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?
答案 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) = NM
是O(N) w.r.t. N
, O(NM) w.r.t N,M
和O(N^2) w.r.t N where M=N
。
如果你想得到更多的肮脏......那就是维基百科或math.stackexchange.com:)