Estoy haciendo esta pregunta porque estoy confundido acerca de un aspecto con respecto a la notación O grande.
Estoy usando el libro, Estructuras de datos y abstracciones con Java de Frank Carrano. En el capítulo sobre "Eficiencia de los algoritmos", muestra el siguiente algoritmo:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Inicialmente describe este algoritmo como teniendo una tasa de crecimiento de (n 2 + n) / 2 . Que mirarlo parece intuitivo.
Sin embargo, se afirma que (n 2 + n) / 2 se comporta como n 2 cuando n es grande. En el mismo párrafo se afirma (n 2 + n) / 2 también se comporta como n 2 / 2 . Él usa esto para clasificar el algoritmo anterior como O (n 2 ) .
Entiendo que (n 2 + n) / 2 es similar a la n 2 / 2 , porque porcentualmente, n hay mucha diferencia. Lo que no entiendo es por qué (n 2 + n) / 2 y N 2 son similares, cuando n es grande.
Por ejemplo, si n = 1,000,000 :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Ese último no es similar en absoluto. De hecho, obviamente, es el doble que el del medio. Entonces, ¿cómo puede Frank Carrano decir que son similares? Además, cómo se clasifica el algoritmo como O (n 2 ) . Mirando ese circuito interno, diría que fue n 2 + n / 2
n
crece, tanto las funciones 'n ^ 2' como su función, se comportan de manera similar, hay una constante diferencia en su tasa de crecimiento. Si tiene una expresión compleja, la función que crece más rápido domina.