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


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 .


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)


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?


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?
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.