大O:嵌套循环依赖


9

我收到了Big O的作业分配。我受嵌套的for循环的困扰,该循环取决于先前的循环。这是我的作业问题的修改版本,因为我确实很想理解它:

sum = 0;
for (i = 0; i < n; i++ 
    for (j = 0; j < i; j++) 
        sum++;

让我失望的j < i部分是那部分。似乎它几乎像阶乘一样执行,但是要加上。任何提示将不胜感激。


尼斯解释这里
saadtaame

Answers:


10

因此,让我澄清一些事情,您对big-O表示法感兴趣-这意味着上限。换句话说,可以计算比实际更多的步骤。特别是,您可以将算法修改为

 ...
    for (j = 0; j < n; j++) 
 ...

因此,您有两个嵌套循环,每个循环运行次,这为您提供了的上限nO(n2)

当然,您希望对上限有一个很好的估计。因此,为了完成,我们要确定一个下限。这意味着可以减少步骤数。所以考虑修改

for (i = n/2; i < n; i++)
    for (j = 0; j < n/2; j++) 
        sum++;

在这里,我们仅执行一些循环迭代。同样,我们有两个嵌套循环,但是这次每个循环有次迭代,这表明我们至少有加法。在这种情况下,我们用表示此渐近下界。由于上下限是重合的,我们甚至可以说是一个紧密的渐近界,我们可以写。n/2n2/4Ω(n2)n2Θ(n2)

如果您想了解更多,请在这里阅读。


6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

让我们追溯一下:

  • 当i = 0时,内部循环将根本不会运行(0<0 == false)。
  • 当i = 1时,内部循环将运行一次(对于j == 0)。
  • 当i = 2时,内部循环将运行两次。(对于j == 0和j == 1)。

因此,此算法将增加sum以下次数:

x=1nx1=0+1+2+3+4...+n1=n(n1)2

通过检查我们可以看到,总和是一个“三角数”。将分布到分子的其余部分,我们得出,其中增长最快的项是因此Bachman-Landau Big-Theta的复杂度是。n 2nn Ñ2θÑ2ÔÑ2一个ÑdΩÑ2n2n2n2θ(n2)O(n2) and Ω(n2)


3

让我们看看我能否解释一下...

所以如果内循环是j

现在,对于第一次迭代,您将通过内部循环执行n-(n-1)次。第二次,您通过内循环执行n-(n-2)次。在第N次,您要进行n-(nn)次,即n次。

如果平均通过内循环的次数,则将为n / 2次。

所以你可以说这是O(n * n / 2)= O(n ^ 2/2)= O(n ^ 2)

那有意义吗?


有点奇怪,但是我想我明白了!谢谢!可能需要花费一些时间才能完全沉入哈哈

因此,如果该j < i部分实际上是j < i^2,则该部分的结果O将为n ^ 2/2?

首先请注意,O(n ^ 2/2)= O(n ^ 2)。现在,如果将其更改为j <i ^ 2,则您在第一次迭代中执行(n-(n-1))^ 2,在最后一次迭代中进行n ^ 2。我不记得内部循环的big-O表示法了。O(n ^ 2)是一个宽松的上限。因此,整个事情的上限是O(n ^ 3),但内部循环小于O(n ^ 2)。那有意义吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.