试图找到此代码块的Big-O估计值:
int a[][] = new int[m][n];
int w = 0;
for (int i = 0; i<m; i++) {
for(int j = 0; j<n; j++) {
if ( a[i][j]%2 == 0) {
w++;
}
}
}
我做了一个简化和简化:O(m)O(n)O(1)=&gt; O(MN)
看起来所有情况都是O(mn),因为如果执行O(1)操作并不重要,这是否正确?或者有最佳/最差/平均情况?
欣赏任何见解!
谢谢
答案 0 :(得分:0)
这里是O(mn)
因为2个循环(其中一个嵌套在另一个循环中)。 O(1)在这里没有意义。 if
不计算在内。它没有中断,所以它不会影响两个循环的整个遍历。这里没有最好或者更糟,再次因为if
不会改变流量,也不会增加w会影响循环。
答案 1 :(得分:0)
是的,这将始终为O(mn),因为如果将测试条件计算为操作,那么是否执行主体并不重要。
它只是常数O(mn * 1/2),但因为1/2只是常数,你可以忽略它。
答案 2 :(得分:0)
在你提供的这段代码中,嵌套循环没有上限,所以你不要使用big-O复杂功能,而是使用big-Theta来描述时间复杂度,在你的情况下,是的是θ(nm)意味着你的算法总是需要θ(nm)时间,并且这里没有最佳/平均/最差情况。