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 < i
partie. Il semble qu'il s'exécuterait presque comme un factoriel, mais avec addition. Tout indice serait vraiment apprécié.
Réponses:
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
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 )n O(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
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/2 n2/4 Ω(n2) n2 Θ(n2)
Si vous voulez en savoir plus, lisez ici .
la source
Voyons cela:
0<0 == false
).Cet algorithme incrémentera donc
sum
le nombre de fois suivant:la source
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
j < i
partie était réellementj < i^2
, l'O résultant pour cette partie serait n ^ 2/2?