【发布时间】:2017-02-22 19:16:58
【问题描述】:
我正在尝试找出以下 2 种算法的大 O 表示法,但遇到了麻烦。
第一个是:
public static int fragment3 (int n){
int sum = 0;
for (int i = 1; i <= n*n; i *= 4)
for (int j = 0; j < i*i; j++)
sum++;
return sum;
} //end fragment 3
答案应该是O(n^4)。当我尝试自己做时,这就是我得到的:
我查看第一个 for 循环并认为它运行 n^2 logn 次。然后对于内部for循环,它运行n次+外部循环的运行时间n^3 logn次。我知道这是错误的,但就是不明白。
对于下面的代码片段,答案是O(n^9)。
public static int fragment6(int n) {
int sum = 0;
for(int i=0; i < n*n*n; i++) {
if(i%100 == 0) {
for(int j=0; j < i*i; j += 10)
sum++;
} // if
else {
for(int k=0; k <= i; k++)
sum++;
} // else
} // outer loop
return sum;
} // fragment 6
当我尝试它时,我得到:n^3 用于外部 for 循环。对于 if 语句,我得到 n,对于第二个 for 循环,我得到 n + 另一个 for 循环和 if 语句,使其成为 n^5。最后,我在最后的 for 循环中得到 n,所有内容加起来为 O(n^6)。
我做错了什么以及获得其O(n^9) 复杂性的正确方法是什么?
【问题讨论】:
标签: java algorithm structure complexity-theory