for循环由变量,时间复杂度递增

时间:2017-01-18 01:30:55

标签: algorithm time-complexity big-o

for (int i = 1; i < a; i++){
    for(int j = 1; j < b; j = j + a){
        Function() <-- O(1)
    }
}

在这种情况下,外循环将执行'a'次(O(a)),和     内循环将执行'b / a'次(O(b / a))。

那么总时间复杂度将是O(a * b / a)= O(b)?

我不是这种解释是对的..

4 个答案:

答案 0 :(得分:1)

O(a * b/a) = O(b)显然是正确的,因为那里有身份:O(b*a/a) = O(b*1) = O(b)

然而,似乎时间复杂度为O(a*b*1)(假设循环不会导致时间上的开销)。计算工作量随着每个单独的循环大小线性增加。这就是O(a*b)的原因。

答案 1 :(得分:1)

我认为这是一个很好的问题,我的想法是

原始复杂性应为O(a) * O(b/a)

但在你得出结论之前,你必须判断案件:

如果b <= a,则O(b/a) = O(1)O(a) * O(b/a) = O(a)

如果b > a,则O(b/a) = O(b/a)O(a) * O(b/a) = O(b)

结合这些案例,我会说它是O(max(a,b))

答案 2 :(得分:0)

Armen是正确的,答案是O(ab)。我们可以通过以下步骤得到答案:

O((A-1)(B-1)(1))

= O(ab-a-b + 1),-a-b + 1可以忽略。

= O(AB)

答案 3 :(得分:0)

O(b)不正确,因为您通过外部循环a次,因此答案必须至少为O(a)(而且,据您所知,b可能是远小于a)。答案应取决于ab,而不仅仅取决于b

仔细计数,你通过内循环ceil((b-1)/a)次,因此复杂性是

O(a*ceil((b-1)/a))

但是,

ceil((b-1)/a) <= (b-1)/a + 1

因此

a*ceil((b-1)/a) <= a*((b-1)/a + 1) = b - 1 + a = a + b - 1

1渐近可忽略不计,因此复杂度为O(a+b)

由于O(a+b) = O(max(a,b))这符合@shole的答案。