sum = 0;
for (i = 1; i <= n; i++) { //#1
for (j = 1; j <= i * i; j++) { //#2
if (j % i == 0) { //#3
for (k = 1; k <= j; k++) { //#4
sum++;
}
}
}
}
以上让我感到困惑
Suppose #1 runs for N times
#2 runs for N^2 times
#3 runs for N/c since for N inputs N/c could be true conditions
#4 runs for N times
因此大致我可以看O(N ^ 5)。我不确定。请帮忙澄清一下。
编辑我想知道if(j%i==0)
的运行时。由于它的父循环需要N^2
个输入,因此执行(N^2)/c
而不是N/c
答案 0 :(得分:6)
我会说它的O(N ^ 4)和它一样。
for (int i = 1; i <= n; i++) //#1 O(n ...
for (int j = i; j <= i * i; j+=i) //#2 ... * n ...
for (int k = 1; k <= j; k++) //#4 ... * n^2) as j ~= i^2
sum++;
或
public static void main(String... args) {
int n = 9000;
System.out.println((double) f(n * 10) / f(n));
}
private static long f(long n) {
long sum = 0;
for (long i = 1; i <= n; i++) //#1
for (long j = 1; j <= i; j++) //#2
sum += i * j; // # 4
return sum;
}
打印
9996.667534360826
非常接近10 ^ 4
答案 1 :(得分:1)
@PeterLawrey做了数学计算,这里是绘制在图表上的基准(my data set - n
与执行时间(以微秒为单位))。
基本上我使用不同的n
输入(X轴)多次运行有问题的代码。然后我将平均执行时间除以n^5
,n^4
和n^3
函数,并将其绘制成:
请注意,这是一个对数刻度,并且所有函数都被缩放到或多或少相同的范围内。
猜猜是什么,avergae执行时间t(n)
除以n^5
不断减少,而t(n)/n^3
不断增长。当接近无穷大时,只有t(n)/n^4
稳定,这证明平均执行时间实际上是O(n^4)
。
答案 2 :(得分:0)
我认为使用Sigma表示法的答案如下: