La complejidad algorítmica describe cómo crece el consumo de recursos (tiempo o memoria) de un algoritmo en función del tamaño de la entrada. Entenderla te permite elegir el algoritmo adecuado para cada problema y razonar sobre escalabilidad.
Los 6 órdenes de complejidad más comunes
| Notación | Nombre | Ejemplo de algoritmo | n=100 ops. |
|---|
O(1) | Constante | Acceso a array por índice, operaciones hash | 1 |
O(log n) | Logarítmica | Búsqueda binaria, BST balanceado | ~7 |
O(n) | Lineal | Búsqueda lineal, recorrido de lista | 100 |
O(n log n) | Lineal-logarítmica | Merge Sort, Heap Sort, Quicksort (promedio) | ~700 |
O(n²) | Cuadrática | Bubble Sort, Insertion Sort, Selection Sort | 10.000 |
O(2ⁿ) | Exponencial | Fibonacci recursivo, subconjuntos de un conjunto | ~10³⁰ |
Cómo razonar la complejidad en voz alta (entrevistas)
Al analizar un fragmento de código, sigue estos pasos en voz alta:
- Identifica los bucles: cada bucle que itera n veces multiplica la complejidad.
- Anidados = multiplicar, secuenciales = sumar: dos bucles anidados → O(n²); dos bucles seguidos → O(n) + O(n) = O(n).
- Busca divisiones: si la entrada se divide por 2 en cada paso → O(log n).
- Simplifica: elimina constantes y términos de menor orden al final.
- Menciona el caso peor: salvo que el entrevistador pregunte por el promedio o el mejor caso.