这个程序的时间复杂度模型是什么?
What's the time complexity model of this program?
import java.util.Scanner;
public class question {
public static void main(String[] args) {
int p = 0;
Scanner input = new Scanner(System.in);
int n = input.nextInt();
input.close();
for (int i = 1; i < n; i = i * 2) {
p++;
}
for (int j = 1; j < p; j = j * 2) {
// statement;
}
}
}
我的教授在讲座中问了我们这个问题,我们给出了两个答案:O(log n)和O(log(log n)),但都被他否定了,他留给我们作为思考问题,我想知道正确答案,但想不出其他答案。请帮助我!
抱歉 n 应该是 1!!!!!
编辑:我回答这个问题时没有注意到 i
被初始化为 0
。仅当问题中所述 i
的初始值是错字时,此答案才是正确的。
这两个循环没有嵌套,这意味着您必须将第一个的复杂性加到第二个的复杂性上。
由于第一个循环耗时 O(log(n))
,第二个循环耗时 O(log(log(n))
,因此总 运行 时间为 O(log(n)) + O(log(log(n)) = O(log(n))
。
第一个循环:
i 从 1 到 n,并在每次迭代中乘以 2。 log2n次迭代后会达到n
,也就是说循环后p
的值为log2 n(或 log2n - 1)。
第二个循环:
j 从 1 到 log2n,并且在每次迭代时乘以 2。它会在 log2(log2n) 次迭代后达到 log2n.
此代码包含两个循环,第一个复杂度 O(log(N))
,第二个复杂度 O(log(log(N)))
。
教授可能希望答案是这两个表达式的总和:
O(log(N) + log(log(N)))
,尽管第二项要小得多,可以忽略,因此导致 O(log(N))
。
可能你的教授想提到输入可能比循环花费更多的时间?我认为 nextint 会读取数字前的空白
import java.util.Scanner;
public class question {
public static void main(String[] args) {
int p = 0;
Scanner input = new Scanner(System.in);
int n = input.nextInt();
input.close();
for (int i = 1; i < n; i = i * 2) {
p++;
}
for (int j = 1; j < p; j = j * 2) {
// statement;
}
}
}
我的教授在讲座中问了我们这个问题,我们给出了两个答案:O(log n)和O(log(log n)),但都被他否定了,他留给我们作为思考问题,我想知道正确答案,但想不出其他答案。请帮助我!
抱歉 n 应该是 1!!!!!
编辑:我回答这个问题时没有注意到 i
被初始化为 0
。仅当问题中所述 i
的初始值是错字时,此答案才是正确的。
这两个循环没有嵌套,这意味着您必须将第一个的复杂性加到第二个的复杂性上。
由于第一个循环耗时 O(log(n))
,第二个循环耗时 O(log(log(n))
,因此总 运行 时间为 O(log(n)) + O(log(log(n)) = O(log(n))
。
第一个循环:
i 从 1 到 n,并在每次迭代中乘以 2。 log2n次迭代后会达到n
,也就是说循环后p
的值为log2 n(或 log2n - 1)。
第二个循环:
j 从 1 到 log2n,并且在每次迭代时乘以 2。它会在 log2(log2n) 次迭代后达到 log2n.
此代码包含两个循环,第一个复杂度 O(log(N))
,第二个复杂度 O(log(log(N)))
。
教授可能希望答案是这两个表达式的总和:
O(log(N) + log(log(N)))
,尽管第二项要小得多,可以忽略,因此导致 O(log(N))
。
可能你的教授想提到输入可能比循环花费更多的时间?我认为 nextint 会读取数字前的空白