关于两个依赖循环的复杂性的困惑?

时间:2018-02-22 15:50:20

标签: algorithm time-complexity big-o

for(i=1; i < n; i++){
   for(j=1; j <= i; j++){
         statement1;
   }       
}
  • 外环= O(N)
  • 内环= N(N-1)/ 2
  • 总= N * N(N-1)/ 2 = N ^ 3

似乎n ^ 3是这些嵌套循环的复杂性。但根据书籍,它的复杂程度是N(N-1)/ 2的n ^ 2。

2 个答案:

答案 0 :(得分:2)

  1. for(i = 1; i&lt; n; i ++){
  2. for(j = 1; j&lt; = i; j ++){
  3. 语句1;
  4. }
  5. }
  6. 为了简化问题,我们假设n在这里是5。 因此,第1行将执行5次,因为它将检查并递增i值5次。 第2行将执行(5-1)= 4次,因为对于i = 5,它将不会执行,但第1行将执行i = 5。 第3行将执行1次,2次3次,依此类推,每次i递增。

    将第3行的复杂性纳入上下文,你会发现它正在执行1 + 2 + 3 + 4 = 10次。它只是从1到4的数字之和,或者你可以说,n(n + 1)/ 2,其中n = 4。 我们可以忽略第1行和第2行的复杂性,因为它们是常数并且是渐近符号,复杂度将是O(n ^ 2)。

答案 1 :(得分:1)

唯一有趣的事情是statement1执行的频率。

因此,请注意类似

的内容
for (int i = 0; i < 2; i++)
    for (int j = 0; j < 3; j++)
        statement1;

触发2 * 3 = 6次执行。因此,您可以计算内循环执行的频率每个外循环迭代

但是,在您的示例中,您犯了一个错误并将外循环的迭代乘以内循环的总迭代,而不是每个外循环迭代的迭代次数

在上面的示例中,2 * 6 = 12代替2 * 3 = 6

让我们仔细看看您的具体示例中会发生什么。外循环触发内循环的n次迭代。内循环首先产生1次迭代。在外循环的下一次迭代中,它将产生2次迭代,然后是3,依此类推。

因此,您将收到内循环的1 + 2 + ... + n = (n^2 - n)/2次迭代。再次注意'总计'。因此statement1总计执行(n^2 - n)/2次。外循环迭代已经被考虑用于计算内循环总运行,没有额外的乘法。

(n^2 - n)/2显然位于O(n^2),因为它的渐近复杂性。直觉上只有最重要的因素起作用,我们可以通过<=进行估算来放弃其他内容。

(n^2 - n)/2
    <= n^2 - n
    <= n^2 in O(n^2)