Calculadora de complejidad Big O: operaciones y tiempo estimado🌎
Actualizado junio de 2026Ver cálculo paso a paso
Cuando escribís un loop anidado o elegís un algoritmo de ordenamiento, estás tomando una decisión que puede significar la diferencia entre 20 milisegundos y 16 minutos de espera. Eso es Big O en la vida real: no una abstracción académica, sino la razón por la que tu aplicación aguanta o se cae cuando el cliente sube 500.000 filas a tu sistema. La notación Big O describe cómo escala la cantidad de operaciones cuando crece el tamaño de entrada n. El problema es que los números son difíciles de internalizar hasta que los ves. ¿Cuánto tarda realmente un O(n²) con n=100.000? ¿Cuándo deja de ser viable un O(2^n)? ¿Vale la pena refactorizar ese algoritmo antes de ir a producción, o es sobreingeniería? Esta calculadora te da la respuesta con números concretos: ingresás n y el tipo de complejidad, y obtenés operaciones totales más tiempo estimado asumiendo una CPU moderna de ~10⁹ operaciones simples por segundo (referencia estándar para análisis de algoritmos; en Python puro ese número cae a ~10⁷, en C++ optimizado puede superar 10⁹). Cubre los seis órdenes más usados en la práctica: O(1) constante, O(log n) logarítmico, O(n) lineal, O(n log n) lineal-logarítmico, O(n²) cuadrático y O(2^n) exponencial. Cada uno corresponde a patrones de código reconocibles: un hash lookup, una búsqueda binaria, un loop simple, un mergesort, un doble loop anidado, una exploración por fuerza bruta. Si estás en code review, en una entrevista técnica, dimensionando una feature nueva o explicándole a un junior por qué su solución no va a escalar, esta herramienta te da el argumento con números reales en segundos.
Cuándo usar esta calculadora
- Tenés que procesar 500.000 registros de ventas mensuales: con O(n log n) tardás ~9,5 ms, con O(n²) tardás ~250 segundos. La diferencia justifica reescribir el ordenamiento.
- Un junior mandó un PR con dos loops anidados sobre una tabla de 80.000 productos. Calculás: O(n²) con n=80k son 6.400 millones de ops, unos 6,4 segundos en cada request. El code review tiene argumento concreto.
- Estás en entrevista en una empresa de e-commerce y te piden comparar bubble sort vs quicksort para un catálogo de 200.000 ítems: O(n²) = 40.000M ops (40 s), O(n log n) = 3,4M ops (3,4 ms). La diferencia es de cuatro órdenes de magnitud.
- Una startup de fintech está evaluando si su algoritmo de matching O(n³) es viable para n=1.000 usuarios activos: 10⁹ operaciones, exactamente en el límite del segundo. Con n=5.000 ya son 125 segundos. Necesita rediseño.
- Implementás un sistema de autocompletado sobre 2 millones de palabras usando búsqueda binaria O(log n): solo 21 comparaciones por consulta. Frente a una búsqueda lineal O(n): 2 millones. La calc muestra por qué el índice vale la pena.
- Querés saber hasta qué n es factible un algoritmo de fuerza bruta O(2^n) para un problema de optimización: n=20 tarda ~1 ms, n=30 ya es ~1 segundo, n=40 son ~18 minutos, n=50 es inviable (años). Fijás el corte en n=25 para casos de prueba.
- Tenés una API que actualmente recibe payloads de 1.000 ítems pero el cliente quiere escalar a 100.000. Calculás el impacto: si el algoritmo es O(n), el tiempo se multiplica por 100 (aceptable); si es O(n²), por 10.000 (catástrofe). La decisión de refactorizar antes del escalado tiene sustento.
- En una clase de algoritmos explicás complejidad: mostrás que n=1.000 en O(n²) son 1 millón de ops (1 ms) pero en O(2^n) son 10³⁰¹ ops, una cantidad que no existe en el universo observable. El contraste hace que el concepto quede.
Ejemplo: ordenar 100.000 registros
- n = 100.000, complejidad = O(n log n) → 1.660.964 operaciones ≈ 1,7 ms
- n = 100.000, complejidad = O(n²) → 10.000.000.000 operaciones ≈ 10 segundos
- Conclusión: mergesort/quicksort (O(n log n)) es ~5.800× más rápido que bubble sort (O(n²)) para este tamaño
Cómo funciona
2 min de lecturaCómo funciona la notación Big O
Cada complejidad tiene su fórmula f(n) de operaciones:
| Complejidad | Fórmula | Ejemplo de algoritmo |
|---|---|---|
| O(1) | 1 | Acceso a array por índice, hash lookup |
| O(log n) | log₂(n) | Búsqueda binaria, árbol AVL |
| O(n) | n | Recorrido de lista, búsqueda lineal |
| O(n log n) | n × log₂(n) | Mergesort, Quicksort (promedio), Heapsort |
| O(n²) | n² | Bubble sort, Insertion sort, dos loops anidados |
| O(2^n) | 2^n | Fuerza bruta TSP, subconjuntos, backtracking ingenuo |
El tiempo estimado asume una CPU ejecutando 10⁹ operaciones básicas por segundo:
> Tiempo (seg) = f(n) / 10⁹
Tabla de referencia: operaciones y tiempo
| n | O(log n) | O(n) | O(n log n) | O(n²) | O(2^n) |
|---|---|---|---|---|---|
| 10 | 3 ops / <1 ns | 10 / <1 ns | 33 / <1 ns | 100 / <1 ns | 1.024 / <1 ns |
| 1.000 | 10 / <1 ns | 1.000 / 1 µs | 9.966 / 10 µs | 1.000.000 / 1 ms | ∞ |
| 10.000 | 13 / <1 ns | 10.000 / 10 µs | 132.877 / 0,1 ms | 100.000.000 / 0,1 s | ∞ |
| 100.000 | 17 / <1 ns | 100.000 / 0,1 ms | 1.660.964 / 1,7 ms | 10¹⁰ / 10 s | ∞ |
| 1.000.000 | 20 / <1 ns | 1.000.000 / 1 ms | 19.931.568 / 20 ms | 10¹² / 16 min | ∞ |
Casos prácticos reales
Errores comunes al aplicar Big O
Calculadoras relacionadas
Preguntas frecuentes
¿Cómo calcula exactamente esta herramienta el tiempo estimado?
La calculadora evalúa la función matemática correspondiente a cada complejidad para el valor de n ingresado: O(1) → 1 operación, O(log n) → log₂(n) operaciones, O(n) → n, O(n log n) → n × log₂(n), O(n²) → n², O(2^n) → 2^n. Luego divide el resultado por 10⁹ (operaciones por segundo de una CPU moderna como referencia estándar) para obtener segundos. Es una estimación de orden de magnitud, no una medición real: el tiempo real depende del hardware, el lenguaje, el compilador, la caché y las constantes ocultas del algoritmo. Usala para comparar alternativas, no para predecir tiempos de producción al milisegundo.
¿Qué significa O(1) en la práctica y cuándo aplica?
O(1) significa que la operación tarda lo mismo sin importar el tamaño de los datos. Ejemplos clásicos: acceder a un elemento de array por índice (arr[42]), buscar en un hash map o diccionario, hacer push o pop en un stack, leer o escribir una variable. En CPU moderna son operaciones de nanosegundos constantes. El error común es pensar que O(1) es siempre 'instantáneo': una operación O(1) con una constante enorme puede ser más lenta que O(n) con n pequeño. Big O solo describe cómo escala, no la velocidad absoluta.
¿Por qué O(log n) es tan eficiente y cómo se produce en código?
O(log n) aparece cuando cada paso del algoritmo descarta la mitad del problema restante. El ejemplo canónico es la búsqueda binaria: en un array de 1.000.000 de elementos ordenados, necesitás como máximo 20 comparaciones (log₂ de 1M ≈ 20). Si duplicás el array a 2M, solo agregás 1 comparación más. En código se produce en: búsqueda binaria, árboles binarios balanceados (AVL, Red-Black), estructuras heap, e índices B-tree en bases de datos relacionales. Para n=1M: O(n) son 1M ops; O(log n) son 20 ops. La diferencia es de cinco órdenes de magnitud.
¿Cuándo un O(n²) empieza a ser un problema real en producción?
Depende del contexto, pero como referencia general con CPU a 10⁹ ops/s: n=1.000 → 1 ms (imperceptible), n=10.000 → 100 ms (notable para el usuario), n=100.000 → 10 segundos (inaceptable en un endpoint web), n=1.000.000 → casi 17 minutos (inviable). El problema es que muchos sistemas arrancan con datasets pequeños donde O(n²) funciona, y el cuello de botella aparece seis meses después cuando el cliente tiene 10× más datos. Si el dominio puede crecer a 10.000 ítems o más, vale la pena buscar una solución O(n log n). En Python puro el límite práctico de O(n²) baja a n=1.000–3.000 por el overhead del intérprete.
¿Qué diferencia hay entre O, Ω y Θ, y cuál importa en entrevistas técnicas?
O (Big O) es la cota superior: el peor caso posible. Ω (Omega) es la cota inferior: el mejor caso. Θ (Theta) es cota ajustada: el algoritmo crece exactamente así en todos los casos. Ejemplo con quicksort: su peor caso es O(n²) cuando el pivote siempre elige el extremo; su promedio es Θ(n log n). En entrevistas técnicas, cuando alguien dice 'la complejidad es...', casi siempre se refiere a O (peor caso). Mergesort es Θ(n log n) en todos los casos, por eso es preferido cuando la consistencia importa más que la velocidad promedio.
¿Cómo determino el Big O de mi propio código sin memorizar nada?
Seguí estas reglas prácticas: un loop simple sobre n elementos → O(n). Dos loops anidados sobre n → O(n²). Tres loops anidados → O(n³). Un loop que en cada iteración divide n a la mitad → O(log n). Una función recursiva que se llama a sí misma dos veces sin memoización → O(2^n). Recursión que divide y combina (mergesort) → O(n log n). Las constantes y términos de menor orden se ignoran: O(3n + 5) se simplifica a O(n). Si tenés un loop O(n) seguido de otro O(n), el resultado sigue siendo O(n), no O(2n).
¿Por qué el tiempo real en Python es mucho mayor al que muestra la calculadora?
La calculadora asume 10⁹ operaciones/segundo, que es la referencia estándar para código compilado (C, C++, Rust, Java JIT). Python interpretado ejecuta aproximadamente 10⁷ operaciones simples por segundo, unas 100 veces más lento. Entonces para Python puro, multiplicá el tiempo estimado por 100. Un O(n²) con n=10.000 que la calculadora muestra como 0,1 s, en Python tarda ~10 s. Por eso NumPy, Pandas y PyTorch delegan los loops pesados a extensiones en C: recuperan los 10⁹ ops/s para las operaciones críticas.
¿Qué es la complejidad espacial y cómo se relaciona con Big O?
Big O también se usa para medir memoria, no solo tiempo. Merge sort es O(n log n) en tiempo pero O(n) en espacio extra porque necesita arrays auxiliares. Quicksort in-place es O(log n) en espacio (solo el stack de recursión). Cuando construís una tabla de hash para resolver un problema en O(n) tiempo, normalmente usás O(n) espacio adicional. En sistemas embebidos, funciones Lambda con límites de RAM, o móviles con poca memoria, el trade-off tiempo-espacio importa tanto como el tiempo de ejecución.
¿Por qué O(2^n) hace imposibles ciertos problemas aunque la CPU sea rápida?
Porque el crecimiento exponencial supera cualquier mejora de hardware. Con n=50, tenés 2^50 ≈ 10¹⁵ operaciones. A 10⁹ ops/s son ~11,6 días. Con una CPU 1000 veces más rápida serían ~16 minutos, lo que sigue siendo inviable en producción. Con n=100, son 2^100 ≈ 10³⁰ operaciones: ninguna computadora puede con eso. La solución no es hardware más rápido sino algoritmos con poda (branch and bound), programación dinámica, o aproximaciones. Para n ≤ 20–25, O(2^n) sigue siendo manejable en muchos contextos.
¿Hay casos donde un algoritmo con peor Big O es mejor opción en la práctica?
Sí, y es uno de los errores más comunes optimizar prematuramente basándose solo en Big O. Las constantes ocultas importan cuando n es pequeño: insertion sort O(n²) es más rápido que merge sort O(n log n) para n < 10–20 elementos porque tiene menos overhead. De hecho, muchas implementaciones de sort en Python (Timsort) y Java usan insertion sort internamente para subarrays pequeños. Big O te da el mapa general; el profiling en producción con datos reales te da el territorio exacto.
¿Cómo usar esta calculadora para tomar decisiones de arquitectura reales?
La estrategia más útil es calcular los dos o tres algoritmos candidatos con el n máximo esperado en producción. Primero estimá el volumen: si tenés 50.000 registros hoy y el negocio crece 3× por año, en dos años estarás en 450.000. Calculá el tiempo para n=450.000 con cada alternativa. Si la diferencia es de milisegundos vs minutos, tenés un argumento sólido para priorizar el refactor. También identificá correctamente qué es n en tu problema: puede ser el número de nodos en un grafo, la longitud de un string, o el tamaño de un batch, no necesariamente el total de registros.
¿Qué es la notación amortizada y por qué no aparece en esta calculadora?
El análisis amortizado describe el costo promedio de una operación a lo largo de una secuencia, no el costo individual en el peor caso. El ejemplo clásico es el array dinámico (ArrayList en Java, vector en C++, list en Python): insertar al final es O(1) amortizado aunque ocasionalmente sea O(n) cuando hay que redimensionar. Si analizás n inserciones consecutivas, el total es O(n), entonces el promedio es O(1) por operación. Esta calculadora trabaja con el análisis de peor caso estándar (Big O clásico), que es lo más relevante para comparar algoritmos entre sí.
Fuentes y referencias
También te puede interesar
Metodología y confianza
Contenido revisado por el equipo editorial de Hacé Cuentas, con apego a nuestra política editorial y metodología de cálculo.
Última revisión: 03 de junio de 2026. Los parámetros fiscales, legales y datos se verifican periódicamente con las fuentes citadas.
Los cálculos corren 100% en tu navegador. No guardamos ni transmitimos tus datos. Leé nuestra política de privacidad.
Resultados orientativos. Para decisiones financieras, médicas o legales críticas, consultá con un profesional.