tiempo resueltos notacion ejercicios ejemplos cuadraticos complejidad calcular big analisis algoritmos algoritmo algorithm time-complexity big-o complexity-theory asymptotic-complexity

algorithm - resueltos - ¿Por qué la complejidad Big-O de este algoritmo O(n ^ 2)?



complejidad en el tiempo (7)

Sé que la complejidad big-O de este algoritmo es O(n^2) , pero no puedo entender por qué.

int sum = 0; int i = 1; j = n * n; while (i++ < j--) sum++;

Aunque establezcamos j = n * n al principio, incrementamos i y disminuimos j durante cada iteración, entonces, ¿no debería ser el número resultante de iteraciones mucho menor que n*n ?


Aunque establezcamos j = n * n al principio, incrementamos i y disminuimos j durante cada iteración, entonces, ¿no debería ser el número resultante de iteraciones mucho menor que n * n?

¡Si! Por eso es O (n ^ 2). Por la misma lógica, es mucho menor que n * n * n , lo que lo convierte en O (n ^ 3). Incluso es O (6 ^ n), por lógica similar.

big-O le brinda información sobre los límites superiores.

Creo que está tratando de preguntarse por qué la complejidad es theta (n) u omega (n), pero si solo está tratando de entender qué es Big-O, realmente necesita comprender que primero da límites superiores a las funciones y principal.


Durante cada iteración, usted incrementa i disminuye j que equivale a simplemente incrementar i en 2. Por lo tanto, el número total de iteraciones es n ^ 2/2 y eso sigue siendo O (n ^ 2).


La complejidad big-O ignora los coeficientes. Por ejemplo: O(n) , O(2n) y O(1000n) son todos el mismo tiempo de ejecución de O(n) . Del mismo modo, O(n^2) y O(0.5n^2) son ambos O(n^2) tiempo de ejecución.

En su situación, esencialmente está incrementando su contador de bucle en 2 cada vez a través de su bucle (ya que j-- tiene el mismo efecto que i++ ). Entonces, su tiempo de ejecución es O(0.5n^2) , pero eso es lo mismo que O(n^2) cuando elimina el coeficiente.


Sí, este algoritmo es O (n ^ 2).

Para calcular la complejidad, tenemos una tabla de las complejidades:

O (1) O (log n) O (n) O (n log n)
O (n²) O (n ^ a) O (a ^ n) O (n!)

Cada fila representa un conjunto de algoritmos. Un conjunto de algoritmos que está en O (1), también está en O (n) y O (n ^ 2), etc. Pero no a la inversa. Entonces, su algoritmo realiza n * n / 2 oraciones.

O (n) <O (nlogn) <O (n * n / 2) <O (n²)

Entonces, el conjunto de algoritmos que incluyen la complejidad de su algoritmo es O (n²), porque O (n) y O (nlogn) son más pequeños.

Por ejemplo: Para n = 100, suma = 5000. => 100 O (n) <200 O (n · logn) <5000 (n * n / 2) <10000 (n ^ 2)

Lo siento por mi Inglés.


Sea m el número de iteraciones tomadas. Entonces,

i + m = n ^ 2 - m

lo que da,

m = (n ^ 2-i) / 2

En la notación Big-O, esto implica una complejidad de O (n ^ 2).


Su algoritmo es equivalente a

while (i += 2 < n*n) ...

que es O(n^2/2) que es igual a O(n^2) porque a la gran complejidad de O no le importan las constantes.


Tendrá exactamente n*n/2 iteraciones de bucle (o (n*n-1)/2 si n es impar). En la notación O grande tenemos O((n*n-1)/2) = O(n*n/2) = O(n*n) porque los factores constantes "no cuentan".