Skip to main content

Abrir el simulador

Compara dos costes con el límite del cociente, busca c y n₀ y resuelve recurrencias con su árbol de llamadas.
Un algoritmo tarda 3n2+4n+43n^2 + 4n + 4 pasos y otro 4n+44n + 4. ¿Cuál es mejor? Para tallas pequeñas la respuesta depende de los detalles, pero a partir de cierto tamaño siempre gana el segundo, porque crece más despacio. La notación asintótica sirve para decir eso con precisión: olvida las constantes y las tallas pequeñas y se queda con lo que decide en problemas grandes, cómo crece el coste. Es el idioma con el que se comparan algoritmos.

Lo que vas a aprender

  • Qué significan OO, Ω\Omega y θ\theta, y cómo se demuestra que una función está en una de ellas.
  • La jerarquía de órdenes, de O(1)O(1) a O(nn)O(n^n).
  • Comparar dos costes con el límite de su cociente.
  • Las reglas de la suma y del producto, y las sumas que aparecen al contar pasos.
  • Plantear la recurrencia de un algoritmo recursivo y resolverla por sustitución.
  • Comprobar el resultado con los modelos generales de sustracción y división.

Cómo se usa el simulador

Pestaña «Comparar órdenes» El panel de la derecha da el límite del cociente f/gf/g y la conclusión, los valores de cc y n0n_0 que cumplen la definición de OO y de Ω\Omega (con c⋅g(n)c \cdot g(n) dibujada a trazos) y la talla en la que las dos curvas se cruzan. Pestaña «Recurrencias» Se muestran la recurrencia, su expansión tras ii pasos, el coste de cada nivel del árbol de llamadas, la solución según la tabla y una comprobación numérica: T(n)T(n) calculado con la recurrencia y dividido entre el orden de la solución, que debe tender a una constante.
El logaritmo se escribe log y es el neperiano. La base no cambia el orden; si quieres log⁡2n\log_2 n exacto, escribe log(n)/log(2).

Fundamentos teóricos

Talla, paso y principio de invarianza

La talla es lo que mide el tamaño del problema: el número de elementos de un vector, las dimensiones de una matriz, el propio número. Un paso es un fragmento de código que tarda un tiempo acotado por una constante, sin importar la talla: una suma, una comparación, una asignación. El coste se mide en pasos, no en segundos. Según el principio de invarianza, dos implementaciones del mismo algoritmo solo se diferencian en una constante multiplicativa. Un ordenador diez veces más rápido divide el tiempo entre diez, pero no cambia la forma en que crece. Por eso las constantes se ignoran y se estudia el orden.

Las tres notaciones

Sean f,g:N→R+f, g: \mathbb{N} \to \mathbb{R}^+, con f(n)f(n) el coste del algoritmo. Cota superior, OO: gg domina a ff a partir de un punto. f(n)∈O(g(n))  ⟺  ∃ c∈R+, ∃ n0∈N:f(n)≤c g(n)∀n≥n0f(n) \in O(g(n)) \iff \exists\, c \in \mathbb{R}^+,\ \exists\, n_0 \in \mathbb{N} : \quad f(n) \le c\, g(n) \quad \forall n \ge n_0 Cota inferior, Ω\Omega: hay un múltiplo de gg que ff nunca baja. f(n)∈Ω(g(n))  ⟺  ∃ c∈R+, ∃ n0∈N:f(n)≥c g(n)∀n≥n0f(n) \in \Omega(g(n)) \iff \exists\, c \in \mathbb{R}^+,\ \exists\, n_0 \in \mathbb{N} : \quad f(n) \ge c\, g(n) \quad \forall n \ge n_0 Orden exacto, θ\theta: las dos a la vez. f(n)∈θ(g(n))  ⟺  ∃ c1,c2,n0: c1 g(n)≤f(n)≤c2 g(n)  ∀n≥n0f(n) \in \theta(g(n)) \iff \exists\, c_1, c_2, n_0 : \ c_1\, g(n) \le f(n) \le c_2\, g(n) \ \ \forall n \ge n_0 Para demostrar que f∈O(g)f \in O(g) basta con dar una pareja cc, n0n_0 que funcione. Por ejemplo, 3n+2∈O(n)3n + 2 \in O(n) porque con c=4c = 4 se cumple 3n+2≤4n3n + 2 \le 4n para todo n≥2n \ge 2. Es justo lo que calcula el simulador.

Jerarquía de órdenes

O(1)⊂O(log⁡n)⊂O(n)⊂O(n)⊂O(nlog⁡n)O(1) \subset O(\log n) \subset O(\sqrt{n}) \subset O(n) \subset O(n \log n) ⊂O(n2)⊂O(n3)⊂O(2n)⊂O(nn)\subset O(n^2) \subset O(n^3) \subset O(2^n) \subset O(n^n) Como O(n)⊂O(n2)O(n) \subset O(n^2), la función 3n+23n + 2 está en O(n)O(n), pero también en O(n2)O(n^2) y en O(2n)O(2^n). Siempre se da la cota más ajustada. Con Ω\Omega las inclusiones van al revés.

Comparar órdenes con límites

La forma más rápida de comparar dos funciones es el límite de su cociente: Con este criterio se ve que la base del logaritmo no importa: para a,b>1a, b > 1, lim⁡n→∞log⁡anlog⁡bn=log⁡ab≠0⟹θ(log⁡an)=θ(log⁡bn)\lim_{n\to\infty} \frac{\log_a n}{\log_b n} = \log_a b \ne 0 \quad\Longrightarrow\quad \theta(\log_a n) = \theta(\log_b n)

Propiedades

Todas valen igual con OO, con Ω\Omega y con θ\theta.
  • Polinomios: un polinomio de grado kk es θ(nk)\theta(n^k). Se queda el término de mayor grado.
  • Regla de la suma: θ(f)+θ(g)=θ(max⁡(f,g))\theta(f) + \theta(g) = \theta(\max(f, g)). Dos bucles seguidos cuestan lo que el más caro.
  • Regla del producto: θ(f)⋅θ(g)=θ(f⋅g)\theta(f) \cdot \theta(g) = \theta(f \cdot g). Un bucle dentro de otro multiplica.
  • Constantes: si f∈θ(h)f \in \theta(h), también af+b∈θ(h)a f + b \in \theta(h) para a>0a > 0.

Sumas habituales

Al contar los pasos de bucles anidados aparecen siempre las mismas sumas: ∑i=1n1=n∑i=1ni=n(n+1)2∑i=1ni2=n(n+1)(2n+1)6\sum_{i=1}^{n} 1 = n \qquad \sum_{i=1}^{n} i = \frac{n(n+1)}{2} \qquad \sum_{i=1}^{n} i^2 = \frac{n(n+1)(2n+1)}{6}

Mejor y peor caso

Si con la talla fija el coste cambia según los datos (las instancias), se estudian el mejor y el peor caso. Entonces el coste se da con Ω\Omega para el mejor caso y con OO para el peor. La búsqueda secuencial es Ω(1)\Omega(1) (el elemento está el primero) y O(n)O(n) (no está). Si no hay instancias, se da directamente con θ\theta.

Algoritmos recursivos: relaciones de recurrencia

El coste de un algoritmo recursivo se escribe en función de sí mismo: T(n)={c1en el caso basea T(s(n))+p(n)en otro casoT(n) = \begin{cases} c_1 & \text{en el caso base} \\ a\,T(s(n)) + p(n) & \text{en otro caso} \end{cases} donde aa es el número de llamadas, s(n)s(n) la talla de cada una (normalmente n−bn - b o n/bn/b) y p(n)p(n) el trabajo que no es recursivo. Se resuelve por sustitución: se cambia T(⋅)T(\cdot) por su definición una y otra vez hasta ver el término general, y se llega al caso base.

Modelos generales de recurrencia

Sustracción (la talla se reduce restando bb): T(n)=a T(n−b)+c nk⟹T(n)∈{θ(nk)a<1θ(nk+1)a=1θ(a ndiv⁡b)a>1T(n) = a\,T(n - b) + c\,n^k \quad\Longrightarrow\quad T(n) \in \begin{cases} \theta(n^k) & a \lt 1 \\ \theta(n^{k+1}) & a = 1 \\ \theta(a^{\,n \operatorname{div} b}) & a \gt 1 \end{cases} División (la talla se divide entre bb): T(n)=a T(n/b)+c nk⟹T(n)∈{θ(nk)a<bkθ(nklog⁡n)a=bkθ(nlog⁡ba)a>bkT(n) = a\,T(n / b) + c\,n^k \quad\Longrightarrow\quad T(n) \in \begin{cases} \theta(n^k) & a \lt b^k \\ \theta(n^k \log n) & a = b^k \\ \theta(n^{\log_b a}) & a \gt b^k \end{cases}
En los exámenes de Algoritmia la tabla no se puede usar, salvo que se diga lo contrario: la complejidad se obtiene resolviendo la recurrencia. La tabla sirve para comprobar el resultado.

Por qué salen esos tres casos: el árbol de llamadas

En el modelo de división, el nivel jj del árbol tiene aja^j llamadas de talla n/bjn/b^j, y cada una hace c (n/bj)kc\,(n/b^j)^k pasos. El nivel entero cuesta: aj⋅c(nbj)k=c nk(abk)ja^j \cdot c\left(\frac{n}{b^j}\right)^k = c\,n^k \left(\frac{a}{b^k}\right)^j Es una progresión geométrica de razón a/bka/b^k, con log⁡bn\log_b n niveles:
  • Si a<bka \lt b^k, cada nivel cuesta menos que el anterior y manda la raíz: θ(nk)\theta(n^k).
  • Si a=bka = b^k, todos los niveles cuestan lo mismo, c nkc\,n^k, y hay log⁡bn\log_b n: θ(nklog⁡n)\theta(n^k \log n).
  • Si a>bka \gt b^k, cada nivel cuesta más y mandan las hojas, que son alog⁡bn=nlog⁡baa^{\log_b n} = n^{\log_b a}.
El simulador dibuja una barra por nivel con su coste: se ve de un vistazo cuál de los tres casos es.

Ejemplos resueltos

Ejemplo 1 · Demostrar una cota con c y n₀

Demuestra que 10n2+4n+2∈θ(n2)10n^2 + 4n + 2 \in \theta(n^2).Cota inferior: 10n2+4n+2≥10n210n^2 + 4n + 2 \ge 10n^2 para todo n≥0n \ge 0, así que vale c1=10c_1 = 10.Cota superior: para n≥1n \ge 1, 4n≤4n24n \le 4n^2 y 2≤2n22 \le 2n^2, luego 10n2+4n+2≤16n210n^2 + 4n + 2 \le 16n^2. Vale c2=16c_2 = 16 con n0=1n_0 = 1.Con el límite es inmediato: lim⁡10n2+4n+2n2=10\lim \dfrac{10n^2 + 4n + 2}{n^2} = 10, una constante distinta de cero. El simulador encuentra c=11c = 11 con n0=5n_0 = 5: también vale, porque no hay una única pareja.
Asintóticamente es mejor 600n2600n^2, porque lim⁡3n3600n2=lim⁡n200=∞\lim \dfrac{3n^3}{600n^2} = \lim \dfrac{n}{200} = \infty.Pero 3n3≥600n2  ⟺  n≥2003n^3 \ge 600n^2 \iff n \ge 200. Para tallas menores que 200, el algoritmo cúbico da menos pasos. Si casi todos los problemas reales son pequeños, conviene el cúbico; para cualquier talla, se pueden combinar los dos y llamar a uno u otro según nn.
T(n)={c1n=0T(n−1)+c2n>0T(n) = \begin{cases} c_1 & n = 0 \\ T(n-1) + c_2 & n \gt 0 \end{cases}Expandiendo: T(n)=T(n−1)+c2=T(n−2)+2c2=⋯=T(n−i)+i c2T(n) = T(n-1) + c_2 = T(n-2) + 2c_2 = \dots = T(n-i) + i\,c_2. Se llega al caso base cuando i=ni = n:T(n)=c1+n c2∈θ(n)T(n) = c_1 + n\,c_2 \in \theta(n)Comprobación: sustracción con a=1a = 1, b=1b = 1, k=0k = 0: θ(nk+1)=θ(n)\theta(n^{k+1}) = \theta(n). ✓
Divide el vector en dos mitades, ordena cada una y las mezcla en tiempo lineal:T(n)=2 T(n/2)+c nT(n) = 2\,T(n/2) + c\,nExpandiendo: T(n)=2i T(n/2i)+i c nT(n) = 2^i\,T(n/2^i) + i\,c\,n. El caso base se alcanza con n/2i=1n/2^i = 1, es decir, i=log⁡2ni = \log_2 n:T(n)=n T(1)+c nlog⁡2n∈θ(nlog⁡n)T(n) = n\,T(1) + c\,n\log_2 n \in \theta(n \log n)Comprobación: división con a=2a = 2, b=2b = 2, k=1k = 1; como a=bk=2a = b^k = 2, sale θ(nlog⁡n)\theta(n \log n). ✓ En el árbol, los log⁡2n\log_2 n niveles cuestan c nc\,n cada uno.
T(n)=T(n−1)+T(ndiv⁡2)+cT(n) = T(n-1) + T(n \operatorname{div} 2) + c no se resuelve directamente. Se acota por los dos lados:
  • Por debajo, cambiando T(n−1)T(n-1) por el más pequeño T(ndiv⁡2)T(n \operatorname{div} 2): T1(n)=2T1(n/2)+c∈θ(n)T_1(n) = 2T_1(n/2) + c \in \theta(n).
  • Por arriba, cambiando T(ndiv⁡2)T(n \operatorname{div} 2) por el más grande T(n−1)T(n-1): T2(n)=2T2(n−1)+c∈θ(2n)T_2(n) = 2T_2(n-1) + c \in \theta(2^n).
Conclusión: T(n)∈Ω(n)T(n) \in \Omega(n) y T(n)∈O(2n)T(n) \in O(2^n). Comprueba las dos en el simulador con «Dos llamadas n/2» y «Dos llamadas n − 1».

Experimenta con el simulador

1

Encuentra el cruce

Carga «3n³ frente a 600n²» y sube la talla máxima. ¿Dónde se cruzan? Cambia 600 por 6000: ¿cómo se mueve el cruce?
2

La base no importa

Carga «Base del logaritmo». ¿A qué constante tiende el cociente? Compárala con log⁡210\log_2 10.
3

Polinómica frente a exponencial

Compara 2n2^n con n10n^{10} en escala logarítmica. ¿A partir de qué talla gana la exponencial? ¿Y con n20n^{20}?
4

Los tres casos del modelo de división

Con b=2b = 2 y k=1k = 1, pon a=1a = 1, a=2a = 2 y a=4a = 4. Mira cómo cambian las barras del árbol: ¿dónde está el coste en cada caso?
5

Comprobación numérica

En Karatsuba, el cociente T(n)/nlog⁡23T(n)/n^{\log_2 3} tiende a una constante. Cambia mentalmente la solución por n2n^2: ¿qué haría el cociente?

Errores frecuentes

  • Dar una cota que no es la más ajustada. Decir que la búsqueda binaria es O(n)O(n) es cierto pero inútil: es O(log⁡n)O(\log n).
  • Confundir OO con «peor caso» y Ω\Omega con «mejor caso». Son cotas de funciones; se usan para el peor y el mejor caso, pero cualquier función tiene las tres.
  • Confundir instancia con talla. Que el algoritmo haga algo distinto cuando n=0n = 0 no es una instancia: es un valor de la talla.
  • Aplicar el modelo de división a una recurrencia de sustracción, o al revés. T(n−1)T(n-1) y T(n/2)T(n/2) dan resultados completamente distintos.
  • Olvidar el trabajo no recursivo. En mergesort, la mezcla es lo que da el factor nn de cada nivel.
  • Creer que θ(log⁡n)≠θ(log⁡2n)\theta(\log n) \ne \theta(\log_2 n). Todas las bases dan el mismo orden.

Límites del criterio asintótico

La notación asintótica describe tallas suficientemente grandes. En la práctica también importan:
  • Las constantes ocultas: un algoritmo teóricamente mejor puede esconder una constante enorme. La multiplicación de matrices de Strassen, θ(n2,81)\theta(n^{2{,}81}), solo compensa con matrices bastante grandes.
  • La talla real de los problemas: si siempre son pequeños, puede ganar el algoritmo asintóticamente peor.
  • La memoria: ganar tiempo suele costar espacio.
  • El coste de desarrollo: si un programa se usa pocas veces, puede compensar uno menos eficiente pero más sencillo.

Un poco de historia

La notación OO la introdujo el matemático Paul Bachmann en 1894, y Edmund Landau la popularizó en teoría de números; por eso se llaman símbolos de Landau. En 1976, Donald Knuth propuso usar Ω\Omega y θ\theta tal como se usan hoy en informática. El teorema que resuelve las recurrencias de división se conoce como teorema maestro desde que lo recogió el libro de Cormen, Leiserson, Rivest y Stein (1990), aunque se basa en un trabajo de Bentley, Haken y Saxe de 1980.

Preguntas frecuentes

O(g)O(g) es un conjunto de funciones, así que lo correcto es f∈O(g)f \in O(g). La forma f=O(g)f = O(g) es una costumbre muy extendida, pero no es una igualdad: no se puede leer al revés.
El criterio del límite no decide, y hay que volver a la definición. Por ejemplo, f(n)=nf(n) = n para nn par y f(n)=n2f(n) = n^2 para nn impar está en O(n2)O(n^2) y en Ω(n)\Omega(n), pero no en θ\theta de ninguna de las dos.
Porque cada llamada hace dos más, T(n)=T(n−1)+T(n−2)+cT(n) = T(n-1) + T(n-2) + c, y el árbol tiene un número de nodos que crece como φn\varphi^n, con φ≈1,618\varphi \approx 1{,}618. Está entre θ(2n/2)\theta(2^{n/2}) y θ(2n)\theta(2^n), como se ve acotando por los dos lados.
Sí. Todo lo que se dice del coste temporal vale para el espacial: basta con contar celdas de memoria en lugar de pasos.
Logarítmico: si ii empieza en nn y se divide entre 2 hasta llegar a 1, da log⁡2n\log_2 n vueltas. Es lo que pasa en la búsqueda binaria.

Temas relacionados

Mejor y peor caso

Análisis experimental: contar operaciones para cada talla.

Divide y vencerás

Algoritmos que se resuelven con recurrencias de división.

Algoritmos de ordenación

Burbuja, selección, inserción, mergesort y quicksort comparados.
Última modificación el 7 de octubre de 2026