给出:
for (int i = 1; i <= n; i *= 2) {
for (int j = 0; j < i; j++) {
// Statement(s) that take(s) constant time
}
}
运行时间复杂度= O(n)
我知道外部循环为log(n)
,内部循环为O(n)
。
但是为什么时间复杂度不是O(n log n)
?为什么是O(n + log n)
?
答案 0 :(得分:0)
部分和计算正确。但是,尽管结果确实为O(n)
,但总执行时间的解释尚不清楚。
通过执行内部语句会消耗实际时间,并且这些语句的执行次数由循环定义。局部和的方法已经考虑了两个循环(i = 1的1个时间单位,i = 2的2个时间单位,i = 4的4个时间单位等),并且总共内部语句将执行O(n)
次,如部分和计算所示。因此,总时间为O(n)*O(constant for the internal statements)=O(n)
。我看不出有任何理由在此处的计算中包括O(logn)
。
答案 1 :(得分:0)
外部循环运行log(n)
次。但是,每次都不会在O(n)
中运行内部循环。如解释中所示,如果i = 1
,则内部循环运行1
次。如果为i = 2
,则内部循环运行2次。如果为i = 4
,则内部循环运行4
次。因此,运行时间总数为T(n) = 1 + 2 + 4 + ... + 2^log(n)
。
现在,简化T(n)
:
T(n) = 2^(log(n)+1) - 1 = 2^log(n) * 2 - 1 = 2n - 1 = Theta(n)