我试图理解复杂性的细微差别 以下每个例子。
int sum = 0;
for (int i = 1; i < N; i *= 2)
for (int j = 0; j < N; j++)
sum++;
我的分析:
第一个for循环为lg n次 内循环独立于外循环,每次外循环执行时执行N次。
所以复杂性必须是:
n + n + n ... lg n次
因此,复杂性为n lg n
。
这是对的吗?
int sum = 0;
for (int i = 1; i < N; i *= 2)
for(int j = 0; j < i; j++)
sum++;
我的分析:
第一个for循环为lg n次 内循环执行取决于外循环。
那么,当内循环执行的次数取决于外循环时,如何计算复杂度?
int sum = 0;
for (int n = N; n > 0; n /= 2)
for (int i = 0; i < n; i++)
sum++;
我认为示例C和示例B必须具有相同的复杂性,因为内部循环执行的次数不依赖于外部循环。
这是对的吗?
答案 0 :(得分:3)
在示例B和C中,内循环执行1 + 2 + ... + n/2 + n
次。这个序列中恰好有lg n
个术语,这意味着int i = 0
执行lg n
次,但内循环中语句的总和是{{1} }。我们得到2n
答案 1 :(得分:1)
(a)您的分析是正确的
(b)外循环变为log(N)次。内循环以1, 2, 4, 8, ...
的顺序进行log(N)次,这是一个几何级数,等于(approx) O(2^log(N))
或最高倍数的两倍。
E.g。 :1 + 2 + 4 = (approx)2*4
,1 + 2 + 4 + 8 = (approx)2*8
。
因此总复杂度为O(2^log(N)) = O(N)
(c)这与(b)的顺序相反
答案 2 :(得分:-1)
精细时间复杂度
I=1;
K=1;
While(k<n)
{
Stmt;
K=k+i;
I++;
}