第二个循环从i到i ^ 2 -1,所以没有。的时间= i ^ 2-i + 1
function(int n) {
外部运行n次
for (int i = 0; i < n; i++) {
for (int j = i; j < i * i; j++) {
if (j % i == 0) {
这将运行j次
for (int k = 0; k < j; k++) {
printf("*");
}
}
}
}
}
答案 0 :(得分:0)
您将在这里找到答案
for (int j = i; j < i * i; j++) {
j运行到i ^ 2(或i * i),导致内部循环为O(i ^ 2)
答案 1 :(得分:0)
所以没有。的时间= i ^ 2-i + 1
如果i
变得更大,例如很大,则i^2
和i
都变得非常大。但是,i^2
正在增加
比i
更快,那么与i
的增加相比,i^2
的增加可以忽略。对于Big-O notation中的time complexity,它表示为 O(i ^ 2)。
此外,它是“ O”(字母O),而不是“ 0”(数字零)。
答案 2 :(得分:0)
您要说的是,因为内部循环从i到i²,所以复杂度一定不能为O(i²)。
的确,复杂度最多 O(i²),但是:
每次将i乘以数字n(在我的例子中为10)时,内部循环将运行n²次。 这说明复杂度至少为 O(i²)。
结论:复杂度完全(=至少+至少)O(i²)
关于复杂性的一般知识:
您将看到的大多数代码在下面的有序列表中或在它们的组合中具有复杂性(稍后会详细介绍):
n^0 (= constant) < log2(n) < sqrt(n) < n < n^2 < exp(n)
复杂度是仅适用于非常大的数字的术语。
它与小值无关,例如,您将看到here。
对于您而言,i²
的价值非常大,在i
前面不知所措,因此O(i²-i) = O(i²)
。
更笼统地说,复杂度只会成倍增加:
O(n)
O(n^2)
O(n^3)
很明显,当您组合复杂性时,顺序将保持不变。
例如,我之前的有序列表乘以O(n)
将变为:
n < n*log2(n) < n*sqrt(n) < n^2 < n^3 < n*exp(n)
如您所见,多亏了我上一个列表中介于n和n ^ 2之间的值。