¡Hola!
Hoy quiero hablarte de algo que, aunque al principio puede parecer intimidante, es absolutamente esencial si quieres construir una carrera sólida en Tech … y eso es … Big O Notation.
Entender Big O de forma práctica puede marcar la diferencia entre escribir soluciones que simplemente funcionan y diseñar sistemas que escalan, sobreviven y triunfan en el mundo real.
Vamos paso por paso:
¿Qué es Big O Notation?
Big O Notation es un lenguaje formal que usamos para describir el comportamiento de un algoritmo conforme crece la entrada.
No se trata de medir tiempos de ejecución específicos en segundos o milisegundos. Se trata de entender cómo cambia la cantidad de recursos que el algoritmo necesita (tiempo o memoria) a medida que crecen los datos.
En otras palabras: Big O abstrae los detalles de hardware, lenguaje y optimizaciones locales para enfocarse en la escalabilidad.
Ejemplo:
- Un algoritmo que procesa cada elemento una sola vez tiene un tiempo lineal: O(n).
- Uno que compara cada elemento contra todos los demás tiene un tiempo cuadrático: O(n²).
¿Por qué es tan importante?
Si vas a construir aplicaciones reales, no solo debes preguntarte:
“¿Funciona en mi laptop con 5 datos?”
sino:
“¿Qué pasa cuando este sistema maneje 5 millones de usuarios simultáneos?”
Big O te permite:
- Comparar algoritmos: elegir la mejor solución para un problema dado.
- Prever cuellos de botella: antes de que colapsen tus servidores en producción.
- Aprobar entrevistas técnicas: la mayoría de entrevistas para SDE (Software Development Engineer) usan problemas de algoritmos donde debes analizar la eficiencia.
- Diseñar sistemas escalables: pensando en el futuro, no solo en el ahora.
Una mala decisión de complejidad puede convertir un sistema funcional en un monstruo inmanejable.
Las complejidades más comunes (y cómo reconocerlas)
Aquí tienes una mini guía para ubicar las complejidades típicas en algoritmos:
Notación | Descripción | Ejemplo común |
---|---|---|
O(1) | Constante. No depende del tamaño de entrada. | Acceso directo a un elemento de un array (arr[i] ). |
O(log n) | Logarítmica. La entrada se reduce a la mitad en cada paso. | Búsqueda binaria en un array ordenado. |
O(n) | Lineal. Procesa cada elemento una vez. | Búsqueda secuencial en una lista desordenada. |
O(n log n) | Quasilineal. Mezcla linealidad y logaritmo. | Merge Sort, QuickSort en promedio. |
O(n²) | Cuadrática. Cada elemento se compara con todos los demás. | Algoritmo de fuerza bruta para encontrar pares. |
O(2ⁿ) | Exponencial. Crece peligrosamente rápido. | Resolver subconjuntos (subset-sum) por fuerza bruta. |
O(n!) | Factorial. Inviable para entradas grandes. | Resolver permutaciones puras (como en TSP). |
¿Cómo analizar la complejidad de un algoritmo?
Cuando quieras determinar el Big O de un algoritmo, enfócate en:
- Identificar loops anidados:
- Cada loop anidado suele multiplicar la complejidad.
- Reconocer divisiones de problema:
- ¿El problema se divide en mitades recursivamente? Piensa en O(log n) o O(n log n).
- Evaluar recursividad:
- Análisis de árboles de recursión puede revelar complejidades ocultas.
- Ignorar constantes:
- O(2n) es lo mismo que O(n) a gran escala.
- Concentrarte en el término dominante:
- Si tienes O(n² + n), te quedas con O(n²) para describir el crecimiento.
Regla práctica:
Cuando dudes, simula el crecimiento del tiempo de ejecución conforme la entrada crece y fíjate qué patrón domina.
Big O en entrevistas técnicas
Protip: No basta con escribir un algoritmo que funcione.
En entrevistas técnicas (Google, Amazon, Microsoft, etc.) esperan que:
- Implementes una solución funcional y eficiente.
- Expliques tu razonamiento sobre la complejidad temporal y espacial.
- Propongas mejoras si encuentras cuellos de botella.
Muchas veces, lograr una mejora de O(n²) a O(n log n) puede ser la diferencia entre un “gracias por participar” y un “te hacemos oferta”.
Inicia una conversación