Introducción a la Eficiencia Algorítmica (Big O)
Publicado el 30 de septiembre de 2025
Entender la notación Big O es la diferencia entre un código que funciona bien en tu local con 10 datos y uno que tumba el servidor cuando llegan 100,000 usuarios. No se trata de medir segundos exactos (que dependen del hardware), sino de medir cómo crece el número de operaciones conforme crecen los datos de entrada ().
Visualizando la Complejidad
Para entender el impacto, observemos cómo se comportan las distintas complejidades cuando aumenta.
- (Verde): Tiempo constante. No importa si es 1 o 1 millón, tarda lo mismo.
- (Azul): Crecimiento lineal. Si duplicas los datos, duplicas el tiempo.
- (Rojo): Crecimiento cuadrático. El rendimiento se degrada exponencialmente. ¡Peligro!
Walkthrough: La suma de 1 a N
Vamos a comparar dos formas de resolver el mismo problema: Sumar todos los números desde 1 hasta .
Enfoque A: El Bucle (Iterativo)
La forma intuitiva es recorrer los números uno a uno y acumularlos.
function sumaIterativa(n) {
let total = 0;
for (let i = 1; i <= n; i++) {
total += i;
}
return total;
}
Análisis: Si , el bucle corre 10 veces. Si , corre 1,000 veces. El número de operaciones crece directamente con la entrada. Complejidad: .
Enfoque B: La Fórmula (Matemático)
Usando la fórmula de la suma de Gauss:
El código se ve así:
function sumaMatematica(n) {
return (n * (n + 1)) / 2;
}
Análisis: Aquí realizamos: 1 multiplicación, 1 suma y 1 división. Total: 3 operaciones. Si , son 3 operaciones. Si , siguen siendo 3 operaciones. Complejidad: .
Análisis Guiado: Bucles Dependientes
A menudo pensamos que dos bucles anidados siempre son simplemente , pero ¿qué pasa cuando el bucle interno depende del externo?
Mira este código:
for (let i = 0; i < n; i++) {
for (let j = 0; j < i; j++) {
console.log(i, j);
}
}
Pista: Esto es una suma de serie aritmética.
- Cuando , el bucle interno corre 0 veces.
- Cuando , corre 1 vez.
- Cuando , corre veces.
Matemáticamente, el total de ejecuciones es:
En Big O, ignoramos las constantes () y los términos no dominantes (). Nos quedamos con el término que crece más rápido. Resultado: .
Tarea Práctica: El costo de la fuerza bruta
Imagina que tienes una lista de IDs de usuarios y quieres encontrar si hay duplicados. Una solución de “fuerza bruta” compara cada elemento con todos los demás.
function tieneDuplicados(lista) {
for (let i = 0; i < lista.length; i++) {
for (let j = 0; j < lista.length; j++) {
// Si son índices distintos pero mismo valor
if (i !== j && lista[i] === lista[j]) {
return true;
}
}
}
return false;
}
El Reto
Calcula teóricamente el impacto de este código si tu lista tiene 1,000,000 de usuarios ().
- Complejidad: .
- Operaciones: (Un billón de comparaciones).
Perspectiva de tiempo: Si tu procesador puede hacer 100 millones de operaciones por segundo (), ¿cuánto tardará este script?
Eso son aproximadamente 2.7 horas para una tarea que, con un algoritmo mejor optimizado (como un mapa hash ), tardaría milisegundos.