估计时间复杂度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))
请帮助检查我的解决方案,或者任何人都可以帮助使解决方案更简单!
答案 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)