Calculadora de Crecimiento Big-O
Datos de entrada
| Tamaño de entrada n | 20 |
|---|
Calculadora de Crecimiento Big-O
Introduce un tamaño de entrada n para comparar cuántas operaciones requiere cada clase de complejidad temporal habitual, desde O(log n) hasta O(n!).
Datos de entrada
Tamaño de entrada
Resultados
Introduce un valor para ver los resultados.
Complejidades habituales
Crecimiento extremo
Crecimiento Big-O
La notación Big-O clasifica cómo escala la demanda de recursos de un algoritmo con el tamaño de la entrada. En lugar de medir segundos en una máquina concreta, captura la forma del crecimiento: ¿se duplica el trabajo cuando n se duplica, o se cuadruplica? Las seis complejidades siguientes son las que se encuentran con mayor frecuencia en libros de texto y entrevistas técnicas.
Las seis clases habituales
O(log n) — Logarítmica. Cada paso elimina una fracción constante del trabajo restante. Una búsqueda binaria sobre un vector ordenado de mil millones de elementos requiere solo 30 comparaciones, porque en cada paso reduce a la mitad el espacio de búsqueda. Las consultas en árboles de búsqueda binaria equilibrados y muchas recurrencias de divide y vencerás caen en esta categoría.
O(n) — Lineal. El trabajo crece en proporción directa al tamaño de la entrada. Recorrer un vector una vez para encontrar su máximo, contar los caracteres de una cadena o leer todos los elementos de una lista son operaciones lineales. Los algoritmos lineales se consideran en general eficientes.
O(n log n) — Lineal-logarítmica. La complejidad más habitual para la ordenación. Merge sort, heapsort y Timsort (utilizado en Python y Java) alcanzan todos O(n log n), que es también el límite teórico inferior para la ordenación basada en comparaciones. Con , esto equivale a unos veinte millones de operaciones: rápido en la práctica.
O(n²) — Cuadrática. Dos bucles anidados sobre la entrada. Bubble sort, insertion sort y la multiplicación matricial ingenua tienen un coste de O(n²) en el peor caso. Con , son cien millones de operaciones; con se convierte en un billón, impracticable para datos grandes.
O(2ⁿ) — Exponencial. El trabajo se duplica con cada elemento adicional. El algoritmo recursivo ingenuo de Fibonacci recalcula subproblemas de forma exponencial; la enumeración por fuerza bruta de todos los subconjuntos de un conjunto también crece como . Con n = 40, el recuento supera un billón.
O(n!) — Factorial. La clase de crecimiento más rápido en el análisis algorítmico cotidiano. Las soluciones por fuerza bruta a problemas de permutaciones —como enumerar todos los posibles recorridos en el Problema del Viajante— realizan una operación por permutación, y hay permutaciones en total. Con n igual a veinte, el recuento supera los dos trillones de operaciones (en escala larga: ).
Ejemplo resuelto con n = 20
La razón entre O(n log n) y O(n!) con n = 20 es de aproximadamente : la diferencia entre una ordenación rápida y esperar más tiempo del que lleva el universo en existir.
Orientaciones prácticas
Los factores constantes y los efectos de caché importan para n pequeño; la complejidad domina para n grande. Un umbral aproximado de n = 10.000 es donde O(n²) empieza a ser incómodo en hardware moderno (suponiendo operaciones simples). A partir de , en general se necesita un algoritmo de O(n log n) o mejor. Los algoritmos exponenciales y factoriales requieren aproximaciones, programación dinámica o estrategias de poda para cualquier entrada real.
Conversor de Base Numérica resulta útil cuando se trabaja con representaciones binarias del espacio de entrada.
Preguntas frecuentes (FAQ)
¿Qué mide realmente la notación Big-O?
La notación Big-O describe el límite superior del crecimiento del tiempo de ejecución (o el uso de memoria) de un algoritmo a medida que aumenta el tamaño de entrada n. Ignora deliberadamente los factores constantes y los términos de orden inferior, porque estos importan menos cuando n crece.
Un algoritmo O(n²) siempre superará a uno O(n log n) para entradas suficientemente grandes, independientemente de la velocidad del hardware. Big-O es una herramienta para comparar diseños de algoritmos, no una predicción precisa del tiempo real de ejecución.
¿Por qué se usa el logaritmo en base 2?
La mayoría de los algoritmos de divide y vencerás (búsqueda binaria, merge sort, árboles de búsqueda binaria equilibrados) dividen el trabajo a la mitad en cada paso, por lo que la profundidad de esa división es log₂ n. En el análisis Big-O la base del logaritmo es solo un factor constante y no cambia la clase de complejidad —log₂ n y log₁₀ n difieren únicamente en una constante—.
Pero la base 2 es la convención en informática por la división binaria. Esta calculadora usa base 2 para ajustarse a esa convención.
¿A partir de qué tamaño de entrada empieza a importar la complejidad?
Para entradas pequeñas, como n < 50, un algoritmo O(n²) bien ajustado suele superar a uno teóricamente más rápido de O(n log n) por su menor coste constante y mejor comportamiento con la caché. La complejidad empieza a dominar cuando n alcanza los cientos o miles.
Con n = 1.000, una ordenación O(n log n) realiza unas 10.000 comparaciones, mientras que una O(n²) realiza 1.000.000. Con n = 1.000.000 la diferencia es de mil millones frente a un billón: la complejidad se convierte en el único factor que importa.
¿Se usa O(n!) en la práctica?
Los algoritmos O(n!) son impracticables para cualquier entrada que no sea muy pequeña. Con n = 20, n! supera los dos trillones de operaciones (en escala larga: 2 × 10¹⁸), muy por encima de lo que cualquier ordenador puede completar en una vida humana.
En la práctica, los problemas NP-difíciles como el Problema del Viajante se resuelven con algoritmos de aproximación, heurísticas o programación dinámica que evitan enumerar todas las permutaciones. La columna factorial de esta calculadora ilustra por qué existen esas técnicas de aproximación.