Big O: imbriqué pour boucle avec dépendance

9

On m'a confié un devoir avec Big O. Je suis coincé avec des boucles imbriquées qui dépendent de la boucle précédente. Voici une version modifiée de ma question de devoirs, car je veux vraiment la comprendre:

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

La partie qui me jette est la j < ipartie. Il semble qu'il s'exécuterait presque comme un factoriel, mais avec addition. Tout indice serait vraiment apprécié.

Raphael
la source
Belle explication ici
saadtaame

Réponses:

10

Alors permettez-moi de clarifier certaines choses, vous êtes intéressé par la notation big-O - cela signifie la limite supérieure . En d'autres termes, il est acceptable de compter plus d'étapes que vous ne le faites réellement. En particulier, vous pouvez modifier l'algorithme pour

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

Vous avez donc deux boucles imbriquées, chaque boucle s'exécute fois, ce qui vous donne une limite supérieure de O ( n 2 )nO(n2)

Bien sûr, vous aimeriez avoir une bonne estimation de la limite supérieure. Donc, pour l'achèvement, nous voulons déterminer une borne inférieure. Cela signifie qu'il est acceptable de compter moins d'étapes. Considérez donc la modification

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

Ici, nous n'effectuons qu'une partie des itérations de boucle. Encore une fois , nous avons deux boucles imbriquées, mais cette fois nous avons itérations par boucle, ce qui montre que nous avons au moins n 2 / 4 ajouts. Dans ce cas, nous désignons cette borne inférieure asymptotique par Ω ( n 2 ) . Puisque les bornes inférieure et supérieure coïncident, nous pouvons même dire que n 2 est une borne asymptotique étroite, et nous écrivons Θ ( n 2 ) .n/2n2/4Ω(n2)n2Θ(n2)

Si vous voulez en savoir plus, lisez ici .

A.Schulz
la source
6
sum = 0;
for (i = 0; i < n; i++)
    for (j = 0; j < i; j++) 
        sum++;

Voyons cela:

  • Lorsque i = 0, la boucle interne ne fonctionnera pas du tout ( 0<0 == false).
  • Lorsque i = 1, la boucle interne s'exécutera une fois (pour j == 0).
  • Lorsque i = 2, la boucle interne s'exécute deux fois. (pour j == 0 et j == 1).

Cet algorithme incrémentera donc sumle nombre de fois suivant:

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

nn2n2n2θ(n2)O(n2) and Ω(n2)

KeithS
la source
3

Voyons voir si je peux expliquer ça ...

Donc, si la boucle intérieure était j

Maintenant, pour la première itération, vous faites n- (n-1) fois à travers la boucle intérieure. la deuxième fois, vous faites n- (n-2) fois à travers la boucle intérieure. La nième fois, vous effectuez n- (nn) fois, ce qui correspond à n fois.

si vous faites la moyenne du nombre de fois que vous traversez la boucle intérieure, ce serait n / 2 fois.

On pourrait donc dire que c'est O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

Cela a-t-il du sens?


la source
C'est un peu bizarre, mais je pense que je comprends! Merci! Cela pourrait prendre un peu de temps pour couler complètement à haha
Donc, si cette j < ipartie était réellement j < i^2, l'O résultant pour cette partie serait n ^ 2/2?
Notons tout d'abord que O (n ^ 2/2) = O (n ^ 2). Maintenant, si vous le changez en j <i ^ 2, alors vous faites (n- (n-1)) ^ 2 sur la première itération et n ^ 2 sur la dernière itération. Je ne me souviens pas de ce que serait la notation big-O pour la boucle interne. O (n ^ 2) est une limite supérieure lâche. Ainsi, une limite supérieure lâche pour l'ensemble serait O (n ^ 3), mais cette boucle intérieure est inférieure à O (n ^ 2). Cela a-t-il du sens?