具有不同内部循环的嵌套循环的复杂性

时间:2012-12-12 05:35:32

标签: c algorithm complexity-theory big-o

非常相似的复杂性示例。我试图理解这些问题是如何变化的。考试即将到来:(任何可以在这里找到复杂性的快捷方式。

案例1:

void doit(int N) { 
   while (N) {
      for (int j = 0; j < N; j += 1) {}
   N = N / 2;   
   }
}

案例2:

void doit(int N) { 
   while (N) {
      for (int j = 0; j < N; j *= 4) {}
   N = N / 2;   
   }
}

案例3:

void doit(int N) { 
   while (N) {
      for (int j = 0; j < N; j *= 2) {}
   N = N / 2;   
   }
}

非常感谢你!

2 个答案:

答案 0 :(得分:4)

void doit(int N) { 
   while (N) {
     for (int j = 0; j < N; j += 1) {}
   N = N / 2;   
   }
}

要找到O(),请注意我们每次迭代将N除以2。所以,(不是为了侮辱你的智力,但为了完整性)通过循环的最终非零迭代,我们将得到N = 1。之前的时间我们将具有N = a(2),然后在那之前N = a(4)...其中0 < a&lt; N(注意那些是非包容性边界)。所以,这个循环将执行总共log(N)次,这意味着第一次迭代我们看到N = a2 ^(floor(log(N)))。

为什么我们关心这个?嗯,这是一个几何系列,有一个很好的封闭形式:

Sum = \sum_{k=0}^{\log(N)} a2^k = a*\frac{1-2^{\log N +1}}{1-2} = 2aN-a = O(N). 

如果有人能弄清楚如何正确地显示该符号,我会非常感激。

答案 1 :(得分:3)

你已经得到数字1 - O(n)的答案,正如@NickO所给出的,这是另一种解释。

用T(N)表示内环的外部重复次数,并将外环的数量设为h。请注意h = log_2(N)

T(N) = N + N/2 + ... + N / (2^i) + ... + 2 + 1
     < 2N (sum of geometric series)
     in O(N)

数字3:O((logN)^2)

用T(N)表示内环的外部重复次数,并将外环的数量设为h。请注意h = log_2(N)

T(N) = log(N) + log(N/2) + log(N/4) + ... + log(1)   (because log(a*b) = log(a) + log(b)
     = log(N * (N/2) * (N/4) * ... * 1)
     = log(N^h * (1 * 1/2 * 1/4 * .... * 1/N))
     = log(N^h) + log(1 * 1/2 * 1/4 * .... * 1/N)    (because log(a*b) = log(a) + log(b))
     < log(N^h) + log(1)
     = log(N^h)                                      (log(1) = 0)
     = h * log(N)                                    (log(a^b) = b*log(a))
     = (log(N))^2                                    (because h=log_2(N))

2号与3号几乎相同。


(2,3:假设j从1开始,而不是从0开始,如果不是这样的情况@WhozCraig给出它永远不会中断的原因