我有以下代码,并试图找出其时间复杂度:
int sum(int m, int n, int K) {
int s = 0;
for (int i = 0; i < n; i++) {
s += i;
if (i == K % 2) {
for (int j = 0; j < m; j++) {
s += j;
}
}
}
return s;
}
根据代码,外循环在O(n)运行,内循环在O(m)运行。但是,内部循环仅执行一次(当i
等于K % 2
时)。我不确定只运行一次的时间复杂度是O(nm)还是O(n + m)。目前,我怀疑复杂度应为O(n + m)。有人可以为我解释这种情况吗?
答案 0 :(得分:2)
它是O( m + n ),因为内部循环只运行一次。
通常将内循环的O( m )复杂度乘以 n 的原因是,通常,内循环执行 n 次。我们应该将每个操作的复杂性乘以完成的次数。在这种情况下,O( m )操作执行一次,因此应乘以1,而不是 n 。
更具体地说,分配s += i;
和比较i == K % 2
总共进行了 n 次,分配s += j;
进行了 m总共次,因此步骤总数为O( m + n )。没有执行 mn 次或 mn 次的任何倍数的操作。