Estou fazendo essa pergunta porque estou confuso sobre um aspecto da grande notação O.
Estou usando o livro Data Structures and Abstractions with Java de Frank Carrano. No capítulo sobre "Eficiência de algoritmos", ele mostra o seguinte algoritmo:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Ele inicialmente descreve esse algoritmo como tendo uma taxa de crescimento de (n 2 + n) / 2 . Que olhar parece intuitivo.
No entanto, é então afirmado que (n 2 + n) / 2 se comporta como n 2 quando n é grande. No mesmo parágrafo ele afirma (n 2 + n) / 2 também se comporta como n 2 / 2 . Ele usa isso para classificar o algoritmo acima como O (n 2 ) .
Eu entendo isso (n 2 + n) / 2 é semelhante ao n 2 / 2 porque percentualmente, n faz pouca diferença. O que eu não entendo é por que (n 2 + n) / 2 e n 2 são semelhantes, quando n é grande.
Por exemplo, se n = 1.000.000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Esse último não é nada parecido. De fato, obviamente, é o dobro do meio. Então, como Frank Carrano pode dizer que são semelhantes? Além disso, como o algoritmo é classificado como O (n 2 ) . Olhando para esse loop interno, eu diria que era n 2 + n / 2
n
cresce, tanto as funções 'n ^ 2' quanto a sua função se comportam de maneira semelhante, há uma constante desconfiança em sua taxa de crescimento. Se você tem uma expressão complexa, a função que cresce mais rapidamente domina.