坚持估计时间复杂性

时间:2016-03-25 02:01:30

标签: time-complexity

估计时间复杂度O(n * m)

 for i ← 0 to n do 
  for j ← 0 to m do 
    STATEMENT1; 
  end for 
 end for 

所以,关于这个算法

 for i ← 0 to n do 
   for j ← 0 to l do 
    STATEMENT1; 
   end for 
   for k ← 0 to m-l do 
    STATEMENT2; 
   end for 
 end for 

因为处理STATEMENT1和STATEMENT2的时间要求不同。如果我们定义处理STATEMENT1 = O(1)的时间和处理STATEMENT2 = Q(1)的时间 我们可以估计这个算法的时间复杂度是n [O [1] + Q [m-1]]或O(n 1)+ Q(n (m-1))

请帮助检查我的解决方案,或者任何人都可以帮助使解决方案更简单!

2 个答案:

答案 0 :(得分:3)

O(n * l + n * (m - l)) = O(n * m)

我认为$ l< M $。否则它会缩小到你的第一个问题。

答案 1 :(得分:0)

让我们考虑STATEMENT1需要k1 (常数)执行时间,类似STATEMENT2需要k2 (常量)执行的时间。

现在,让我们做一些数学运算:

<强>语句1:

STATEMENT1执行的总次数n.l。因此,它所花费的总时间= n.l.k1

<强>声明2:

STATEMENT2执行的总次数n.(m-l)。因此它所花费的总时间=
n.(m-l).k2

现在,算法所花费的总时间为:

=> n.l.k1 + n.(m-l).k2
=> n.(l.k1 + (m-l).k2)
=> n.(l.k1 + m.k2 - l.k2)
=> n.(m.k2 + l.(k1 - k2))

Now separate these two equations out and apply big_O notation onto them

=> n.m.k2        +         n.l.(k1 - k2)    (Apply Big O notation)
  since k2 is             since k1-k2 is
   constant                 constant

=> O(n.m)  +   O(n.l)  -eq(i)

eq(i)分成3个案例的时间如下:

案例1: m >>> l
然后(n.m)将接管(n.l) 并且,最终的等式将变为O(n.m)

案例2: l >>> m
然后(n.l)将接管(n.m) 并且,最终的等式将变为O(n.l)

案例3: l ≈ m

=> O(n.m)  +   O(n.l) 
=> O(n.m)  +   O(n.m)  Since l ≈ m
=> 2.O(n.m)            Since we are dealing with Big O thus we can eliminate a prefix 2
=> O(n.m)