【发布时间】:2020-03-11 00:20:34
【问题描述】:
int sum = 0;
for(int i = 1; i < n; i++) {
for(int j = 1; j < i * i; j++) {
if(j % i == 0) {
for(int k = 0; k < j; k++) {
sum++;
}
}
}
}
我不明白什么时候 j = i, 2i, 3i... 最后一个 for 循环运行 n 次。我想我只是不明白我们是如何根据if 声明得出这个结论的。
编辑:我知道如何计算所有循环的复杂性,除了为什么最后一个循环基于 mod 运算符执行 i 次......我只是不明白它是如何 i 的。基本上,为什么 j % i 不能达到 i * i 而不是 i?
【问题讨论】:
-
您可以通过多次降低此代码的复杂性大的因素。暗示: 数字 1 到 n 的和是 ((n+1)*n)/2提示 2:
for (j = i; j < i *i; j += i)那么你不需要模数测试(因为j保证可以被i整除)。 -
O() 函数是一个球场函数,因此此示例中的任何循环都会增加复杂性。第二个循环运行到 n^2。 if 语句被忽略。
-
@ChristophBauer
if声明是绝对不忽略。这个if语句意味着复杂度是O(n^4) 而不是O(n^5),因为它导致最内层循环只执行i次而不是i*i次对于第二个循环的每次迭代. -
@kaya3 完全错过了
k < n^2部分。所以它是 O(n^5),但知识(通过理解if)建议 O(n^4)。 -
如果这不仅仅是课堂练习,请将第二个循环更改为 for(int j = i; j < i * i; j+=i)