这个带乘法的嵌套循环的时间复杂度是多少?
What time complexity is this nested loop with multiplication?
educative.io 认为下面的代码具有复杂度 log2(n!) 因为 var
随着 n 的每个值增加。
但是,我和我的伙伴认为因为 var
总是 < n
所以它不可能是 log2(n!) 因为它永远不会比 while 花费更多的时间循环 运行 n
。如果在 while 谓词中使用了 n
,则时间复杂度为 n*log2(n).
public static void main(String[] args) {
int n = 10;
for (int var = 0; var < n; var++) {
int j = 1;
while(j < var) {
j *= 2;
}
}
}
你们都对。首先,为什么它是 O(log n!):
如果将每次迭代的成本加起来,总运行时间为 O(log 1 + log 2 + ... + log n)。
根据对数乘积法则,log a + log b = log a×b。
因此,O(log 1 + log 2 + ... + log n) = O(log 1×2×...×n) = O(log n!).
一旦成立,就可以证明O(log n!) = O(n log n)。他们其实是一样的复杂度class.
你应该考虑这个说法,你们都是对的:
O(n*lg(n))=O(lg(n!))
educative.io 认为下面的代码具有复杂度 log2(n!) 因为 var
随着 n 的每个值增加。
但是,我和我的伙伴认为因为 var
总是 < n
所以它不可能是 log2(n!) 因为它永远不会比 while 花费更多的时间循环 运行 n
。如果在 while 谓词中使用了 n
,则时间复杂度为 n*log2(n).
public static void main(String[] args) {
int n = 10;
for (int var = 0; var < n; var++) {
int j = 1;
while(j < var) {
j *= 2;
}
}
}
你们都对。首先,为什么它是 O(log n!):
如果将每次迭代的成本加起来,总运行时间为 O(log 1 + log 2 + ... + log n)。
根据对数乘积法则,log a + log b = log a×b。
因此,O(log 1 + log 2 + ... + log n) = O(log 1×2×...×n) = O(log n!).
一旦成立,就可以证明O(log n!) = O(n log n)。他们其实是一样的复杂度class.
你应该考虑这个说法,你们都是对的:
O(n*lg(n))=O(lg(n!))