找到时间复杂性

时间:2013-09-22 19:06:56

标签: c algorithm time-complexity

我试图理解复杂性的细微差别 以下每个例子。

示例A

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

这是对的吗?

例B

int sum = 0;
for (int i = 1; i < N; i *= 2)
   for(int j = 0; j < i; j++)
      sum++;

我的分析:

第一个for循环为lg n次 内循环执行取决于外循环。

那么,当内循环执行的次数取决于外循环时,如何计算复杂度?

示例C

int sum = 0;
for (int n = N; n > 0; n /= 2)
   for (int i = 0; i < n; i++) 
      sum++;

我认为示例C和示例B必须具有相同的复杂性,因为内部循环执行的次数不依赖于外部循环。

这是对的吗?

3 个答案:

答案 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*41 + 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++;
}