Sto ponendo questa domanda perché sono confuso su un aspetto della notazione O grande.
Sto usando il libro, Strutture di dati e astrazioni con Java di Frank Carrano. Nel capitolo "Efficienza degli algoritmi" mostra il seguente algoritmo:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Inizialmente descrive questo algoritmo con un tasso di crescita di (n 2 + n) / 2 . Il che guardarlo sembra intuitivo.
Tuttavia, si afferma quindi che (n 2 + n) / 2 si comporta come n 2 quando n è grande. Nello stesso paragrafo afferma (n 2 + n) / 2 si comporta anche molto simile a n 2 / 2 . Lo usa per classificare l'algoritmo sopra come O (n 2 ) .
Ottengo che (n 2 + n) / 2 è simile a n 2 / 2 , perché la percentuale saggia, n fa poca differenza. Quello che non capisco è perché (n 2 + n) / 2 e n 2 sono simili, quando n è grande.
Ad esempio, se n = 1.000.000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Quest'ultimo non è affatto simile. In effetti, ovviamente, è il doppio di quello centrale. Quindi, come può Frank Carrano dire che sono simili? Inoltre, come viene classificato l'algoritmo come O (n 2 ) . Guardando quel ciclo interno direi che era n 2 + n / 2
n
cresce, sia le funzioni 'n ^ 2' che la tua funzione si comportano in modo simile, c'è una costante differenza nel loro tasso di crescita. Se hai un'espressione complessa, domina la funzione che cresce più velocemente.