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

标签 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;   
   }
}

非常感谢!

最佳答案

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 < 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). 

如果有人能弄清楚如何让 latexy 符号正确显示给我,我将不胜感激。

关于具有不同内部循环的嵌套循环的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13833448/

相关文章:

loops - 在复杂性分析中,为什么++ 被认为是 2 个操作?

有人可以解释一下这个声明中发生了什么吗?

php - 如何解决这个PHP算法?

javascript - 使 HTML5 canvas floodfill 高效

java - 使用Gauss-Legendre算法在java中逼近Pi

memory - 字典使用 Trie 还是 SortedSet?

c - 如何求一个数的原根

c - PROTECT 到底应该包裹什么?

c - 在C中,变量不保留我分配给它的值并返回到0

java - for 循环的运行时,其中变量依赖于外部循环