Pregunta central
¿Cómo comparamos algoritmos sin depender de una computadora concreta y cómo expresamos rigurosamente la rapidez con la que crece su costo?
Respuesta corta
Se define el tamaño de la entrada, se fija un modelo de cómputo y se cuentan operaciones primitivas para obtener . Luego se conserva el orden de crecimiento con (cota superior), (cota inferior) o (cota ajustada). Esta abstracción permite comparar escalamiento, aunque para entradas concretas también importan constantes, memoria y hardware.
Mapa de la clase
flowchart TB P["Problema"] --> N["Tamaño n"] N --> M["Modelo de cómputo"] M --> C["Contar: T(n)"] C --> A["Simplificar crecimiento"] A --> O["O: techo"] A --> OM["Ω: piso"] A --> TH["Θ: cota ajustada"] TH --> E["Comparar escalamiento"]
Del problema a una cota asintótica
El análisis no empieza adivinando una letra . Se avanza en orden: definir qué crece, decidir qué operaciones cuestan una unidad, especificar qué caso se estudia, contar y solo entonces simplificar.
1. ¿Qué significa analizar un algoritmo?
Charles Babbage ya formulaba la pregunta esencial: si una máquina puede obtener el mismo resultado de varias maneras, ¿qué secuencia lo obtiene con menos trabajo? En su máquina analítica la intuición era cuántas veces hay que girar la manivela.
Hoy se miden principalmente dos recursos:
- Tiempo: número de operaciones primitivas ejecutadas.
- Memoria: número de celdas ocupadas.
El conteo solo tiene sentido después de declarar el modelo de cómputo.
Paso 1: definir el tamaño de la entrada
El símbolo debe medir la cantidad de información recibida:
- arreglo: = número de elementos;
- cadena: = número de símbolos;
- grafo: suelen intervenir vértices y aristas;
- entero : el tamaño es aproximadamente bits, no el valor .
Por qué importa
Un algoritmo que realiza pasos no es lineal en el tamaño binario del entero: como , puede ser exponencial en .
Paso 2: fijar el modelo de cómputo
| Modelo | Qué cuenta como paso | Ventaja | Limitación |
|---|---|---|---|
| Máquina de Turing determinista | Transición, lectura/escritura y movimiento del cabezal | Modelo teórico simple | No ofrece acceso aleatorio |
| Word RAM | Aritmética/lógica, acceso a arreglo, lectura/escritura, apuntadores y saltos | Se parece a una computadora real | Operaciones con enteros enormes requieren un modelo más fino |
En word RAM, cada palabra tiene bits y se supone , para que un índice o dirección quepa en una palabra.
flowchart LR IN["entrada"] --> CPU["programa"] CPU <-->|"leer/escribir en Θ(1)"| MEM["memoria word RAM"] MEM --> ARR["A[i]"] MEM --> PTR["seguir apuntador"] CPU --> OUT["salida"]
El modelo puede cambiar la respuesta
Reconocer un palíndromo de bits requiere al menos orden cuadrático en una máquina de Turing de una cinta, mientras que con acceso aleatorio puede hacerse en tiempo lineal. No hay contradicción: cambiaron las operaciones permitidas.
Paso 3: elegir el tipo de análisis
| Tipo | Pregunta que responde | Ejemplo |
|---|---|---|
| Peor caso | ¿Cuál es el máximo costo entre entradas de tamaño ? | Garantía para cualquier entrada |
| Esperado (probabilístico) | ¿Cuál es el costo esperado del azar del algoritmo? | Quicksort aleatorio usa cerca de comparaciones en esperanza |
| Amortizado | ¿Cuánto cuesta cualquier secuencia completa de operaciones? | push/pop en un arreglo redimensionable cuestan en total |
| Caso promedio | ¿Cuál es el promedio bajo una distribución de entradas? | Requiere justificar esa distribución |
El peor caso se formaliza como
No debe confundirse tiempo esperado con caso promedio: el primero promedia el azar interno del algoritmo para una entrada fija; el segundo promedia entradas según una distribución.
Excepciones prácticas
En la vida cotidiana, se usan algoritmos de tiempo exponencial ya que los peores casos no aparecen (simplex, grep linux, k-means).
2. Tratabilidad computacional
Fuerza bruta
Un algoritmo de fuerza bruta enumera soluciones candidatas y verifica cada una. Suele ser fácil de describir, pero puede necesitar , o más pasos.
En emparejamiento estable, probar los emparejamientos perfectos y verificar su estabilidad es correcto, pero impracticable incluso para valores moderados de .
Tiempo polinomial
Un algoritmo es de tiempo polinomial si existen constantes y tales que, para toda entrada de tamaño ,
La propiedad clave aparece al duplicar la entrada:
El costo aumenta por un factor constante , independiente de .
flowchart TB N["entrada n"] --> D["entrada 2n"] D --> P["nᵇ: multiplica por 2ᵇ"] D --> E["2ⁿ: pasa de 2ⁿ a 2²ⁿ"] P --> T["escalamiento controlado"] E --> X["explosión combinatoria"]
En teoría se llama eficiente a un algoritmo polinomial porque esta clase es relativamente estable ante cambios razonables del modelo de cómputo. En la práctica, la palabra eficiente exige más cuidado.
Polinomial no significa automáticamente práctico
es polinomial, pero sus constantes y exponente lo hacen inútil para casi cualquier entrada. El análisis asintótico describe el comportamiento cuando crece; no reemplaza una evaluación concreta.
Eficiencia aslgorítimca
Decimos que un algoritmo es eficiente si tiene tiempo de ejecucion polinomial.
3. Notación asintótica
Sea el costo y una función de referencia. Las notaciones ignoran constantes multiplicativas y una cantidad finita de valores iniciales, pero responden preguntas distintas.
: cota superior
Interpretación: desde cierto punto, es un techo para .
: cota inferior
Interpretación: desde cierto punto, es un piso para .
Además,
: cota ajustada
para todo . Por tanto,
Mnemotecnia
es techo, es piso y es el sándwich entre ambos.
Visualización de las tres cotas
En el ejemplo , la curva queda por debajo de y por encima de para . Cambia de vista para observar el techo, el piso y su combinación.
Ejemplo completo con constantes explícitas
Sea
Para , se cumple y , así que
Esto prueba con y . También,
por lo que con . Juntando ambos resultados,
y entonces
Una cota correcta puede ser poco informativa
Para
son ciertas las afirmaciones y . La segunda es más floja: no es falsa, solo describe peor el crecimiento real.
Abuso de notación
es un conjunto de funciones. Lo formal es escribir
Es común ver , pero esa “igualdad” solo expresa pertenencia. De y no se deduce que .
Algoritmo frente a problema
“Este algoritmo usa comparaciones” acota una estrategia. “Todo algoritmo de ordenamiento por comparaciones necesita ” acota el problema dentro de un modelo.
4. Reglas para simplificar costos
Propiedades de
- Reflexividad: .
- Constantes: si y , entonces .
- Productos: si y , entonces .
- Sumas: .
- Transitividad: si y , entonces .
La regla de sumas justifica ignorar términos menores:
Por qué funciona la regla del producto
Si, para suficientemente grande,
entonces, al multiplicar,
La desigualdad vale desde .
Criterio del cociente
Cuando existe
se obtiene:
| Valor de | Conclusión |
|---|---|
| y | |
| y |
El recíproco de la primera fila es falso: no obliga a que tenga límite; el cociente puede oscilar entre dos constantes positivas.
Familias comunes
- Si con , entonces .
- Las bases constantes de los logaritmos difieren solo por una constante:
- Para y , .
- Para y , .
- Por la fórmula de Stirling, .
flowchart LR C["1"] --> LG["log n"] --> N["n"] --> NL["n log n"] --> N2["n²"] --> N3["n³"] --> EX["2ⁿ"] --> FAC["n!"]
Cada flecha significa “crece asintóticamente más lento que”.
Funciones de varias variables
Si
entonces
Solo con una precondición como puede simplificarse a . Por la misma razón, el costo de BFS no debe reducirse a sin una relación entre aristas y vértices.
Método de examen
- Escribir qué significa .
- Identificar el modelo y las operaciones de costo constante.
- Indicar si se analiza peor caso, esperanza o costo amortizado.
- Obtener una expresión antes de simplificar.
- Para demostrar , proponer y y verificar un techo.
- Para demostrar , proponer y y verificar un piso.
- Para concluir , demostrar ambos con la misma función de referencia.
Errores frecuentes
- Confundir con “igualdad exacta” o con “peor caso”.
- Decir que es falso para una función : es cierto, pero flojo.
- Escribir “requiere al menos ”; una cota inferior se expresa con .
- Eliminar de un costo sin una precondición.
- Usar una gráfica con pocos valores como demostración: la desigualdad debe valer para todo .
- Creer que polinomial significa siempre rápido en la práctica.
Quizzes de las diapositivas 13, 17–20
| Quiz | Respuesta | Razón |
|---|---|---|
| 1 | C | y por transitividad también |
| 2 | A | ; cumplir la desigualdad para infinitos no basta |
| 3 | A | ; el cociente puede oscilar y no tener límite |
Autoevaluación
- Puedo explicar por qué el tamaño de un entero es su número de bits.
- Puedo distinguir word RAM de una máquina de Turing de una cinta.
- Puedo diferenciar peor caso, esperado, amortizado y caso promedio.
- Puedo demostrar con constantes explícitas.
- Puedo explicar por qué una cota superior no tiene que ser ajustada.
- Puedo analizar una función que dependa de y sin ocultar variables.
Resumen después de clase
Analizar un algoritmo consiste en convertir su ejecución en una función de costo bien definida. El modelo word RAM aproxima operaciones comunes de una computadora y el peor caso ofrece una garantía para toda entrada. El tiempo polinomial captura un escalamiento controlado. Finalmente, , y permiten hablar de techos, pisos y cotas ajustadas ignorando constantes y comportamiento inicial, pero sin olvidar las hipótesis ni las variables de la entrada.
Conexión con la siguiente clase
La diapositiva 24 abre la sección de implementación. El jueves se usará todo lo anterior para demostrar que una representación cuidadosa de Gale–Shapley alcanza y para estudiar ejemplos de a tiempo exponencial.
→ Jueves 27 — Implementación y tiempos de ejecución
Referencias
- Kevin Wayne, Algorithm Analysis, diapositivas 1–24, actualización del 16 de diciembre de 2021.
- Jon Kleinberg y Éva Tardos, Algorithm Design, capítulo 2.