我想弄清楚这段代码的时间复杂性。
我对这些部分的最后结论是' while' O(logn)部分 外部for循环必须小于100,所以它的O(1)和内部for循环是O(logn)所以我认为在最坏的情况下这里的时间复杂度是O(logn),但我不确定。
public void foo (int n, int m) {
int i = m;
while (i > 100) {
i = i/3;
}
for (int k=i ; k>=0; k--) {
for (int j=1; j<n; j*=2) {
System.out.print(k + "\t" + j);
}
System.out.println();
}
}
答案 0 :(得分:2)
让我们一步一步地破解你的代码:
第一个循环,即
while (i > 100)
i = i/3;
运行O(logm)次。
for (int k=i ; k>=0; k--) {
for (int j=1; j<n; j*=2) {
System.out.print(k + "\t" + j);
} //end inner for loop
System.out.println();
}
外环可以运行最多100次,内环可以运行
for (int j=1; j<n; j*=2) {
System.out.print(k + "\t" + j);
} //end inner for loop
执行登录时间。
for循环的总时间复杂度= 100logn - &gt;忽略常数 - &gt;登录
因此,复杂度为O(log(m))+ O(log(n))