繁体   English   中英

误解小细节w /嵌套for循环时间复杂度分析...如何分辨O(n)和O(n²)分开

[英]Misunderstanding small details w/ nested for-loop time complexity analysis… How to tell O(n) and O(n²) apart

对于以下算法:

 int x = 0;
 for (int i = 0; i < n; i++)
     for (j = 0; j < n; j++) {
         if (j < i) j = j + n;
         else x = x + 1;
      }

所以对于这个算法,我的思维过程是这样的:

i=0时,内循环对j执行n次迭代。 但是,对于i=0,1..n-1每个值, j将只执行一次迭代,因为if语句将计算为true并结束内部循环。

这是我的困惑之源:

由于外循环将执行n次迭代,无论如何,并且由于内部循环在i=0 (非常第一次迭代)时执行n次迭代,为什么大时间复杂度不是O(n²)而是, O(n)如果循环嵌套并且在第一次迭代中都执行n次迭代?

你有一条线说if (j < i) j = j + n; 它基本上脱离了循环(当j < i ),并且由于内循环从0开始,这将在每次第一次迭代时触发(第一次除外),使其在恒定时间内运行。

你基本上只有一个循环。 代码可以重写为

int x = 0;
for (int i = 0; i < n; i++) {
    x = x + 1;
}

这清楚地说明了为什么它是O(n)。

你可以从内循环打印ij的值:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        System.out.print(i + "" + j + " ");
        if (j < i) j = j + n;
        else x = x + 1;
    }
    System.out.println();
}

输出:

00 01 02 03 04 ..
10
20
30
40
..

它仅代表矩阵的第一行和第一列,因此复杂性为:

O(2n) => O(n).

你正确地注意到只有i=0内循环才会迭代n次。 对于i>0内部循环仅运行一次。 我们可以求和所有这些迭代:i 0 + i 1 + ... + n-1 ,其中i 0 =n ,对于其他索引i x =1 因此,内部迭代的总和将是n + n - 1 => 2n - 1 这给出了我们: O(2n - 1) => O(2n) - O(1) => 2*O(n) - O(1) => O(n)

对于每n次外迭代,都有n次内迭代。 因此,您将进行n * n = n ^ 2次计算,因此复杂度为O(n ^ 2)。 这有意义还是更令人困惑?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM