No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
14 Hrs
28 Min
27 Seg

Cálculo de la notación Big-O

12/18
Recursos

Si queremos un algoritmo que sea óptimo en el espacio o en tiempo, necesitamos una notación Big-O. ¿Cómo la calculamos? El proceso para calcular esta notación varía según la complejidad temporal o espacial.

Notación Big-O en complejidad temporal

Analicemos los siguientes casos para calcular la notación Big-O en complejidad temporal, independiente de la capacidad de procesamiento de tu computador, en estos casos evaluaremos de manera general el peor de los casos que demora un algoritmo en un sistema igual.

  • Variables: tienen una notación constante O(1) debido a que al crear una variable se demora un tiempo constante.
  • Condicionales: tienen una notación constante O(1) debido a que procesa la condición en un tiempo constante.
  • Ciclos repetitivos: tienen una notación lineal O(n) debido a que en el peor de los casos, estos ejecutan n veces una instrucción.
  • Ciclos repetitivos anidados: tienen una notación cuadrática O(n^2) debido a que cada ciclo interno se ejecuta n veces el ciclo externo.
Notaciones básicas en complejidad temporal de un algoritmo

Notación Big-O en complejidad espacial

Analicemos los siguientes casos para calcular la notación Big-O en complejidad espacial, independiente de la capacidad de procesamiento de tu computador, en estos casos evaluaremos de manera general el peor de los casos el espacio que ocupa un algoritmo en memoria.

  • Variables: tienen una notación constante O(1) debido a que guarda un espacio de memoria.
  • Condicionales: tienen una notación constante O(1) debido a que procesa la condición en un espacio de memoria.
  • Ciclos repetitivos: tienen una notación lineal O(1) debido a que procesa el bucle en un espacio de memoria.
  • Arrays: tienen una notación lineal O(n) porque guarda en memoria n elementos.
  • Matrices o array de arrays: tienen una notación cuadrática O(n^2) porque por cada elemento del array guarda otro array de n elementos.
Notaciones básicas en complejidad espacial de un algoritmo

También puedes ver esta representación gráfica, donde cada cuadrado es un espacio de memoria utilizado por arrays y matrices (array de arrays).

Representación de arrays y matrices en memoria

Simplificar la notación

Simplificar la notación consiste en representar el crecimiento del algoritmo con una notación general, en lugar de una función específica. En otras palabras, eliminar las constantes que en este análisis no cambia drásticamente el resultado final.

Notaciones simplificadas

El crecimiento siempre importa

La complejidad de un algoritmo nace de cuántos recursos utiliza el algoritmo al ejecutarse. La notación Big-O solo se enfoca en el crecimiento en el peor de los casos, no en los valores que puede tener un algoritmo en segundos o bytes.

Contribución creada por Andrés Guano (Platzi Contributor).

Aportes 11

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

let bar = 'test'	// O(1)
if() {}		// O(1)
for() {}		// O(n)
while() {}	// O(n)
for() { for() {} }// O(n^2)

Me está encantando el curso 😄, les comparto mis apuntes de esta clase:

Notación Big-O en complejidad temporal

let bar = 'test'	// O(1)
if() {}		// O(1)
for() {}		// O(n)
while() {}	// O(n)
for() { for() {} }// O(n^2)

Big-O complejidad algoritmica espacial

let bar = 'test'  // 0(1)
if () {}               // 0(1)
for () {}             // 0(1)
let resultado = [1,2,...,n]  // 0(n)
let dimensional = [[2,4],[6,8],[10,12]] //0(n^2)

El crecimiento importa

La complejidad de un algoritmo nace de cuántos recursos utiliza el algoritmo al ejecutarse.

La notacion Big-O solo se enfoca en el crecimiento.

Un algoritmo puede correr en una computadora muy vieja-lenta o en una muy nueva-rapida, pero el crecimiento (ritmo) sea el mismo, la complejidad será la misma. Pero esto es en base a los recursos que esa computadora tiene.

Conclusión

Revisamos el código en nuestro algoritmo para medir su complejidad en la notación Big-O.

La notacion Big-O se enfoca en el crecimiento

🗳️ Cálculo de la notación Big-O

Apuntes

  • Para poder calcular la notación Big O depende si se desea medir el tiempo o espacio

Notación Big-O en complejidad temporal

let bar = 'test' // O(1)
if(){} // O(1)
for(){} // O(n)
while(){} // O(n)
for(){ for(){} } // O(n^2)

Notación Big-O en complejidad espacial

  • Comprende en ver cuantas variables se van creando
let bar = 'test' // O(1)
if(){} // O(1)
for(){} // O(1)
let resultado = [1, 2, ..., n] // O(n)
let dimensional = [[1, 2], [3, 4], ...] // O(n²)
  • Para simplificar la notación nos concentramos en el valor podemos abreviarlo de la siguiente manera
    • O(2n) ⇒ O(n)
    • O(50) ⇒ O(1)
    • O(n² + 50) ⇒ O(n²)
  • Es posible simplificar de esta manera, ya que solo nos importa el grado mayor

El crecimiento importa

  • La complejidad de un algoritmo nace de cuantos recursos utiliza el algoritmo al ejecutarse.
  • La notación Big-O solo se enfoca en el crecimiento.
Esta clase me complemento mas para entender la complejidad espacio tiempo, vengo de la complejidad algoritmica con python pero este es mas teorico y con ejemplos mas faciles de digeriri

Y en qué nivel de big-o queda una función recursiva? O(2^n)?

Cálculo de la notación Big-O

Notación Big-O en complejidad temporal

let bar = 'test'	// O(1)
if() {}		// O(1)
for() {}		// O(n)
while() {}	// O(n)
for() { for() {} }// O(n^2)

Big-O complejidad algorítmica espacial

let bar = 'test'  // 0(1)
if () {}               // 0(1)
for () {}             // 0(1)
let resultado = [1,2,...,n]  // 0(n)
let dimensional = [[2,4],[6,8],[10,12]] //0(n^2)

Para simplificar la notación quitamos los valores variantes no tan importantes, por ejemplo; con el número pi = 3.14159265358979, mientras más dígitos mayor precisos serán los resultados, pero ya que en los algoritmos el tiempo de ejecución siempre cambiará es mejor eliminar estas variaciones, quedándonos sólo con las clases, de la siguiente manera.

O(2n) ⇒ O(n)

O(50) ⇒ O(1)

O(n² + 50) ⇒ O(n²)

El crecimiento importa

La complejidad de un algoritmo nace de cuántos recursos utiliza el algoritmo al ejecutarse.

Así como un algoritmo se puede tardar más o menos dependiendo de factores como la computadora, memoria, etc. La complejidad de un algoritmo será siempre la misma, aunque en un dispositivo tarde 10 segundos y en otro 10 milisegundos, el ritmo de crecimiento se conserva.

Es por esto que la notación Big-O solo se enfoca en el crecimiento, y no en datos absolutos.

¿ De qué depende la optimización en ambas complejidades algorítmicas tanto temporal o espacial?

Big-O complejidad algoritmica espacial

let bar = 'test'  // 0(1)
if () {}               // 0(1)
for () {}             // 0(1)
let resultado = [1,2,...,n]  // 0(n)
let dimensional = [[2,4],[6,8],[10,12]] //0(n^2)
El Alogritmo para Multiplicar Matrices n.m en C \nEs un Algorithmo O ( n.m.h ) lo que es Eq ~ O ( n³ ) para multiplicar todos los Elmenetos de una Array\[ n] \[ m] cual es una Matrix .\n Un Algoritmo de typo Password Cracker por Fuerza Bruta si que puede ser una O\[ n! ] y n aumenta cuando aumenta el numero de characters de my password a cracker! tanto como el numero de letras en \[ Alphabet ] y este aumentara mucho mas si se incluyesen specialCharacters : \[ | "#$%&\*/+-.,\_ {\[( \* ) ] } . por tanto si que pueden existir algoritmos con complejidad superior a Polinomios n3 . \n

La notación Big-O consiste en encontrar la función que describe el crecimiento en el uso de recursos (tiempo o espacio), de allí que lo importante sea únicamente la función, no su desplazamiento a través del eje (que serian los términos independientes como “2” multiplicando o “50” sumando).