Je pose cette question parce que je suis confus sur un aspect concernant la notation O grand.
J'utilise le livre, Structures de données et abstractions avec Java de Frank Carrano. Dans le chapitre sur "l'efficacité des algorithmes", il montre l'algorithme suivant:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Il décrit initialement cet algorithme comme ayant un taux de croissance de (n 2 + n) / 2 . Ce qui semble intuitif.
Cependant, il est alors indiqué que (n 2 + n) / 2 se comporte comme n 2 lorsque n est grand. Dans le même paragraphe , il déclare (n 2 + n) / 2 se comporte aussi beaucoup comme n 2 / 2 . Il l'utilise pour classer l'algorithme ci-dessus comme O (n 2 ) .
Je reçois que (n 2 + n) / 2 est similaire à n 2 / 2 parce que le pourcentage sage, n fait peu de différence. Ce que je ne comprends pas, c'est pourquoi (n 2 + n) / 2 et n 2 sont similaires, quand n est grand.
Par exemple, si n = 1 000 000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Ce dernier n'est pas du tout similaire. En fait, bien évidemment, c'est deux fois plus que celui du milieu. Alors, comment Frank Carrano peut-il dire qu'ils sont similaires? En outre, comment l'algorithme est-il classé comme O (n 2 ) . En regardant cette boucle intérieure, je dirais que c'était n 2 + n / 2
n
grandit, les fonctions «n ^ 2» et votre fonction se comportent de la même manière, il y a une diffidence constante dans leur taux de croissance. Si vous avez une expression complexe, la fonction qui grandit plus vite domine.