let bar = 'test' // O(1)
if() {} // O(1)
for() {} // O(n)
while() {} // O(n)
for() { for() {} }// O(n^2)
Fundamentos de Algoritmos
Todo lo que aprenderás sobre complejidad algorítmica con JS
Estructura de un algoritmo
¿Cómo elegir un buen algoritmo?
Complejidad algorítmica
Introducción a complejidad algorítmica
Complejidad espacial
Complejidad temporal
Complejidad temporal en práctica
Complejidad espacial en práctica
El estado de la complejidad
Análisis asintótico
Introducción a análisis asintótico
Notación Big-O
Cálculo de la notación Big-O
Evaluación de complejidad temporal con Big-O
Evaluación de complejidad espacial con Big-O Avanzado
Recomendaciones
Recomendaciones para la evaluación de algoritmos
Notas sobre algoritmos
Cierre del curso
Bonus
Determinando la complejidad un algoritmo avanzado
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
Paga en 4 cuotas sin intereses
Termina en:
Marcelo Arias
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.
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.
O(1)
debido a que al crear una variable se demora un tiempo constante.O(1)
debido a que procesa la condición en un tiempo constante.O(n)
debido a que en el peor de los casos, estos ejecutan n
veces una instrucción.O(n^2)
debido a que cada ciclo interno se ejecuta n
veces el ciclo externo.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.
O(1)
debido a que guarda un espacio de memoria.O(1)
debido a que procesa la condición en un espacio de memoria.O(1)
debido a que procesa el bucle en un espacio de memoria.O(n)
porque guarda en memoria n
elementos.O(n^2)
porque por cada elemento del array guarda otro array de n
elementos.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).
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.
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
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:
let bar = 'test' // O(1)
if() {} // O(1)
for() {} // O(n)
while() {} // O(n)
for() { for() {} }// O(n^2)
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)
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.
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
let bar = 'test' // O(1)
if(){} // O(1)
for(){} // O(n)
while(){} // O(n)
for(){ for(){} } // O(n^2)
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²)
Y en qué nivel de big-o queda una función recursiva? O(2^n)?
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)
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).
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?