Je dois calculer la complexité temporelle du code suivant:
for (i = 1; i <= n; i++)
{
for(j = 1; j <= i; j++)
{
// Some code
}
}
Est-ce que O (n ^ 2) ?
Un moyen rapide pour expliquer cela est de le visualiser.
si i et j vont de 0 à N, il est facile de voir O (N ^ 2)
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
O O O O O O O O
dans ce cas, c'est:
O
O O
O O O
O O O O
O O O O O
O O O O O O
O O O O O O O
O O O O O O O O
Il s’agit de la moitié de N ^ 2, qui est toujours O (N ^ 2)
En effet, c’est O (n ^ 2). Voir aussi un exemple très similaire avec le même runtime ici .
Tout d'abord, considérons les boucles où le nombre d'itérations de la boucle interne est indépendant de la valeur de son index. Par exemple:
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
sequence of statements
}
}
La boucle externe s'exécute N fois. Chaque fois que la boucle externe s'exécute, la boucle interne exécute M fois. En conséquence, les instructions de la boucle interne exécutent un total de N * M fois. Ainsi, la complexité totale des deux boucles est O (N2).
A la 1ère itération de la boucle externe (i = 1), la boucle interne itérera 1 fois À la 2ème itération de la boucle externe (i = 2), la boucle interne itérera 2 fois 3ème itération de la boucle externe (i = 3), la boucle interne itérera 3 fois
.
.
Lors de l'itération FINALE de la boucle externe (i = n), la boucle interne sera Itérer n fois
Ainsi, le nombre total de fois que les instructions de la boucle interne seront exécutées .__ sera égal à la somme des entiers compris entre 1 et n, soit:
((n)*n) / 2 = (n^2)/2 = O(n^2) times