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)?
我不是这种解释是对的..
答案 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
)。答案应取决于a
和b
,而不仅仅取决于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的答案。