Lección
La teoría — Explorador de complejidad Big-O
La notación O grande es una cota superior del crecimiento, no una medida de tiempo. Decir que un algoritmo es O(N²) afirma que, a partir de cierto tamaño de entrada, su trabajo se mantiene por debajo de un múltiplo fijo de N² — no dice nada sobre segundos ni tampoco sobre entradas pequeñas.
Qué significa cada símbolo
N- el tamaño de la entrada — cuántos elementos recibe el algoritmo. Es el número establecido arriba, de 2 a 1.000.000.
f(N)- el trabajo realmente realizado con ese tamaño, contado en operaciones abstractas en lugar de segundos.
c- un multiplicador constante que la notación tiene permitido ocultar. La afirmación es
f(N) ≤ c·g(N); c podría ser 2 o 2000, y esa es precisamente la información que la notación O grande descarta. n₀- el tamaño a partir del cual debe cumplirse la cota. Por debajo de
n₀las clases pueden ordenarse de cualquier manera, razón por la cual los cinco números anteriores se agrupan cuando N es pequeña.
De dónde viene la fórmula
- Comienza a partir de la afirmación que se debe precisar: el trabajo
f(N), a la larga, no crece más rápido que alguna función de referenciag(N). - “No más rápido” debe tolerar un factor constante, porque optimizar un bucle interno cambia la constante y no la forma. Así que se permite un multiplicador:
f(N) ≤ c·g(N). - Y “a la larga” debe disculpar las entradas pequeñas, donde puede pasar cualquier cosa. Exige la desigualdad solo cuando
N ≥ n₀. En conjunto:f(N) = O(g(N))significa que existen algúnc > 0y algúnn₀tales quef(N) ≤ c·g(N)para todoN ≥ n₀.
Cómo leer lo que ves
Las cinco filas representan un mismo tamaño de entrada evaluado en cinco clases de crecimiento con todas las constantes fijadas en 1 — de modo que son conteos de operaciones, no tiempos de ejecución. Con el valor predeterminado N = 100, muestran 1, 7, 100, 664 y 10,000. El logaritmo es en base 2: log₂ 100 ≈ 6.64, razón por la cual O(log N) muestra 7 y O(N log N) muestra 664 en lugar de 700.
- Supone
- Que una operación cuesta lo mismo que cualquier otra y que el conteo es exacto en lugar de medido. Eso es lo que hace que la comparación sea limpia e igualmente lo que la hace abstracta — los patrones de acceso a memoria, el comportamiento de la caché y el disco quedan fuera de este modelo, y en el hardware real deciden habitualmente cuál de dos algoritmos gana.
- Falla cuando
- La cota no promete nada por debajo de
n₀, y puedes verlo directamente: estableceN = 2y las cinco clases muestran1,1,2,2y4— prácticamente indistinguibles. El orden que la notación garantiza solo emerge cuando N es grande, razón por la cual un métodoO(N²)con una constante pequeña puede superar a unoO(N log N)en cualquier entrada que llegues a tener en la práctica.
Problema resuelto al detalle
-
Dónde se abre la brecha entre N log N y N ² 5 pasos
Con N = 100, el panel muestra 664 para N log N y 10 000 para N². Eso es solo un factor de quince, distando mucho del abismo que se presupone entre clases de complejidad. Averigüe dónde se abre realmente el abismo.
-
Comience por los dos números. log₂ 100 es 6,6439, de modo que N log₂ N es 664 y N² es 10 000.
-
La razón entre ellos no es constante, y esa es la clave de las clases de complejidad. Al dividir, N se simplifica una vez, dejando N/log N —una cantidad que crece sin límite, solo que despacio.
-
Con N = 100 es 15,1. Es una diferencia real pero poco impresionante: una aceleración de quince veces es la clase de mejora que un mejor factor constante podría proporcionar, que es exactamente la razón por la que las pruebas de rendimiento con entradas pequeñas inducen a error.
-
Introduzca ahora un millón. El logaritmo apenas se ha movido —de 6,6 a 19,9, un factor de tres— mientras que N ha aumentado diez mil veces. La razón es ahora de 50 172.
-
Y nunca invierte la tendencia. La derivada de N/log N es positiva para todo N superior a e, de modo que no existe un tamaño de entrada a partir del cual el algoritmo cuadrático lo alcance.
Respuesta
La herramienta muestra 664 frente a 10 000 para N = 100. La cifra que conviene recordar es la otra: para un millón, esas mismas dos curvas están separadas por 50 172. Las clases de complejidad no se refieren a un centenar de elementos, y compararlas ahí es la forma habitual de convencerse a uno mismo de elegir el algoritmo equivocado —una diferencia de quince veces parece algo que un lenguaje más rápido podría recortar—. Mueva el deslizador hacia arriba y observe cómo la razón aumenta con él. Esa es también la razón por la que el logaritmo se ignora tan a menudo en la práctica: creció por un factor de tres mientras que la entrada se multiplicó por diez mil.
-
Ruta de aprendizaje
Contar trabajo, no segundos
Referencias (1)
- The definition the lesson states, and the case for using it carefully: D. E. Knuth, “Big Omicron and big Omega and big Theta.” ACM SIGACT News 8, 18–24, 1976.