Clases de Complejidad: P, NP y BPP
La jerarquía de dificultad computacional.
Introducción: Clasificando Problemas por Dificultad
Ya sabemos usar Big-O para analizar algoritmos específicos. Ahora clasificamos problemas según su dificultad inherente.
Pregunta central: ¿Qué tan difícil es este problema en el mejor caso posible?
Repaso: Lenguajes de Decisión
Recordemos que estudiamos problemas de decisión (respuesta sí/no):
Formato estándar: $L = {x \mid x \text{ satisface la propiedad } P}$
Ejemplos:
- $\text{SORTED} = {\langle L \rangle \mid L \text{ está ordenada}}$
- $\text{CONNECTED} = {\langle G \rangle \mid G \text{ es un grafo conexo}}$
- $\text{SAT} = {\langle \phi \rangle \mid \phi \text{ es una fórmula satisfacible}}$
Nota: Problemas de optimización se pueden reducir a decisión:
- Optimización: “¿Cuál es el tour más corto?”
- Decisión: “¿Existe un tour de longitud $\leq k$?”
La Clase P (Polynomial Time)
Definición
$$\mathbf{P} = {L \mid L \text{ es decidible en tiempo polinomial por una MT determinista}}$$
En palabras: P contiene todos los problemas que podemos resolver eficientemente.
Formalmente: Existe una MT determinista y una constante $k$ tal que decide $L$ en tiempo $O(n^k)$.
Ejemplos en P
✅ 1. Búsqueda
- Problema: ¿$x$ está en la lista $L$?
- Algoritmo: Recorrer la lista
- Complejidad: $O(n)$ ✓
✅ 2. Ordenamiento
- Problema: Ordenar lista $L$
- Algoritmo: Mergesort
- Complejidad: $O(n \log n)$ ✓
✅ 3. Conectividad en Grafos
- Problema: ¿Hay camino de $u$ a $v$ en grafo $G$?
- Algoritmo: BFS o DFS
- Complejidad: $O(V + E)$ ✓
✅ 4. Camino Más Corto
- Problema: ¿Distancia de $u$ a $v$ es $\leq k$?
- Algoritmo: Dijkstra
- Complejidad: $O(V^2)$ o $O(E \log V)$ ✓
✅ 5. Matching en Grafos Bipartitos
- Problema: ¿Existe matching perfecto?
- Algoritmo: Ford-Fulkerson
- Complejidad: $O(VE)$ ✓
✅ 6. Aritmética
- Sumar, restar, multiplicar, dividir
- Complejidad: Polinomial en el tamaño de los bits
✅ 7. Programación Lineal
- Optimizar función lineal con restricciones lineales
- Algoritmo: Elipsoide (Khachiyan 1979)
- Complejidad: Polinomial ✓
Propiedades de P
Cerrado bajo:
- ✓ Unión: Si $L_1, L_2 \in \mathbf{P}$ → $L_1 \cup L_2 \in \mathbf{P}$
- ✓ Intersección: $L_1 \cap L_2 \in \mathbf{P}$
- ✓ Complemento: $\overline{L} \in \mathbf{P}$
- ✓ Concatenación, estrella de Kleene, etc.
P es robusta:
- Equivalente para MT multi-cinta, RAM, etc.
- Las diferencias son solo constantes multiplicativas
La Clase NP (Nondeterministic Polynomial Time)
Definición (Vía Verificación)
$$\mathbf{NP} = {L \mid L \text{ tiene un verificador polinomial}}$$
Verificador: Algoritmo $V$ tal que:
$$x \in L \iff \exists \text{ certificado } c \text{ tal que } V(x, c) = \text{acepta}$$
Y $V$ corre en tiempo polinomial en $|x|$.
Intuición: “Fácil de Verificar”
Idea: Resolver el problema puede ser difícil, pero verificar una solución propuesta es fácil.
Analogía:
- Resolver sudoku: Difícil (puede requerir backtracking)
- Verificar sudoku resuelto: Fácil (revisar filas/columnas/bloques)
Definición Alternativa (MT No Determinista)
$$\mathbf{NP} = {L \mid L \text{ es decidible en tiempo polinomial por una MT no determinista}}$$
MT No Determinista: Puede “adivinar” la respuesta correcta.
- Si existe secuencia de elecciones que lleva a aceptar → acepta
- Corre en tiempo polinomial si todas las ramas terminan en tiempo polinomial
Equivalencia: Certificado $c$ = secuencia de elecciones no deterministas
Ejemplos en NP
✅ 1. SAT (Satisfacibilidad Booleana)
- Problema: ¿Existe asignación que satisface $\phi$?
- Certificado: Una asignación $A$
- Verificación: Evaluar $\phi$ con $A$ → $O(n)$ ✓
- (Vimos esto en el módulo de Lógica)
✅ 2. CLIQUE
- Problema: ¿$G$ tiene un clique de tamaño $\geq k$?
- Certificado: Un conjunto $C$ de $k$ vértices
- Verificación: Revisar que todo par en $C$ es adyacente → $O(k^2)$ ✓
✅ 3. SUBSET-SUM
- Problema: ¿Existe subconjunto que suma exactamente $k$?
- Certificado: El subconjunto
- Verificación: Sumar elementos → $O(n)$ ✓
✅ 4. HAMILTONIAN-PATH
- Problema: ¿$G$ tiene un camino hamiltoniano?
- Certificado: Una secuencia de vértices
- Verificación: Revisar que es camino válido y visita todos → $O(n)$ ✓
✅ 5. TSP (Decisión)
- Problema: ¿Existe tour de longitud $\leq k$?
- Certificado: Una permutación de ciudades
- Verificación: Calcular longitud del tour → $O(n)$ ✓
✅ 6. 3-COLORING
- Problema: ¿$G$ es 3-coloreable?
- Certificado: Una coloración de vértices
- Verificación: Revisar que aristas no conectan mismo color → $O(E)$ ✓
✅ 7. COMPOSITES (números compuestos)
- Problema: ¿$n$ es compuesto?
- Certificado: Un factor no trivial $p$
- Verificación: Dividir $n$ por $p$ → polinomial ✓
P ⊆ NP
Teorema: $\mathbf{P} \subseteq \mathbf{NP}$
Prueba: Si $L \in \mathbf{P}$, existe algoritmo polinomial que lo decide.
Construir verificador:
V(x, c): // c es ignorado
Ejecutar algoritmo para L en x
Aceptar sii algoritmo acepta
Este es un verificador polinomial → $L \in \mathbf{NP}$ ✓
Intuición: Si puedes resolver algo rápido, también puedes verificarlo rápido (¡ignora el certificado!).
La Clase NP-Completo
Reducciones Polinomiales
Decimos que $L_1 \leq_p L_2$ ($L_1$ se reduce a $L_2$) si existe una función $f$ computable en tiempo polinomial tal que:
$$x \in L_1 \iff f(x) \in L_2$$
Intuición: Si puedes resolver $L_2$, puedes resolver $L_1$ (transformando la entrada).
Definición de NP-Completo
Un lenguaje $L$ es NP-completo si:
- $L \in \mathbf{NP}$
- Para todo $L’ \in \mathbf{NP}$: $L’ \leq_p L$
En palabras: $L$ es al menos tan difícil como cualquier problema en NP.
Consecuencia: Si encontramos algoritmo polinomial para un problema NP-completo, entonces $\mathbf{P} = \mathbf{NP}$.
El Primer Problema NP-Completo
Teorema de Cook-Levin (1971): SAT es NP-completo.
Idea de la prueba:
- SAT está en NP (ya vimos)
- Para cualquier $L \in \mathbf{NP}$:
- $L$ tiene MT no determinista $M$ que corre en tiempo polinomial
- Dada entrada $x$, construir fórmula $\phi_{M,x}$ que es satisfacible sii $M$ acepta $x$
- $\phi_{M,x}$ codifica: estados, transiciones, aceptación
- Construcción toma tiempo polinomial
- Por lo tanto, $L \leq_p \text{SAT}$ para todo $L \in \mathbf{NP}$ → SAT es NP-completo ✓
Otros Problemas NP-Completos
Una vez que SAT es NP-completo, podemos probar que otros problemas también lo son mediante reducciones:
Patrón:
- Tomar problema NP-completo conocido (ej: SAT)
- Reducirlo al nuevo problema
- El nuevo problema es NP-completo
Ejemplos NP-Completos:
| Problema | Reducción desde |
|---|---|
| 3-SAT | SAT |
| CLIQUE | 3-SAT |
| VERTEX-COVER | CLIQUE |
| HAMILTONIAN-PATH | VERTEX-COVER |
| TSP | HAMILTONIAN-PATH |
| 3-COLORING | 3-SAT |
| SUBSET-SUM | VERTEX-COVER |
| KNAPSACK | SUBSET-SUM |
Miles de problemas son NP-completos — aparecen en scheduling, optimización, biología, criptografía, etc.
Consecuencias de NP-Completitud
Si un problema es NP-completo:
❌ Probablemente no hay algoritmo polinomial (asumiendo $\mathbf{P} \neq \mathbf{NP}$)
✅ Soluciones prácticas:
- Heurísticas — Algoritmos que funcionan bien en promedio (sin garantías)
- Aproximación — Solución cercana al óptimo con garantías
- Casos especiales — Restricciones que lo hacen polinomial
- Exponencial mejorado — $O(1.5^n)$ en lugar de $O(2^n)$
Ejemplo (TSP):
- Exacto: Exponencial
- Heurística: Nearest neighbor (rápido, sin garantías)
- Aproximación: Christofides (garantiza ≤ 1.5 × óptimo)
- Casos especiales: TSP métrico, euclidiano
P vs NP: El Problema del Millón
La Pregunta
$$\mathbf{P} \stackrel{?}{=} \mathbf{NP}$$
En palabras: ¿Resolver es tan fácil como verificar?
Estado Actual
✓ Lo que sabemos:
- $\mathbf{P} \subseteq \mathbf{NP}$ (demostrado)
- Hay miles de problemas NP-completos
- Nadie ha encontrado algoritmo polinomial para ningún problema NP-completo
- Nadie ha probado que no existe tal algoritmo
❓ Lo que NO sabemos:
- Si $\mathbf{P} = \mathbf{NP}$ o $\mathbf{P} \neq \mathbf{NP}$
Creencia de la Comunidad
~99% de expertos creen: $\mathbf{P} \neq \mathbf{NP}$
Razones:
- 50+ años de intentos sin éxito
- Miles de problemas NP-completos, ninguno resuelto eficientemente
- Diferencia fundamental entre “encontrar” y “verificar” parece profunda
Pero: No hay prueba. Es posible que $\mathbf{P} = \mathbf{NP}$.
Implicaciones si P = NP
Si alguien encuentra algoritmo polinomial para SAT (o cualquier problema NP-completo):
🚀 Revoluciones positivas:
- Criptografía rota (pero también nuevos algoritmos)
- Optimización perfecta (scheduling, rutas, diseño)
- Avances en biología (protein folding)
- IA super-poderosa (aprendizaje óptimo)
- Matemáticas automatizadas (encontrar pruebas)
💥 Consecuencias negativas:
- Seguridad de internet colapsaría
- RSA, criptografía actual inútil
- Necesitaríamos nuevos sistemas de seguridad
Opinión mayoritaria: Probablemente no sucederá.
Implicaciones si P ≠ NP
Confirmación de límites:
- Hay problemas inherentemente difíciles
- No todo es optimizable
- Algunas cosas requieren heurísticas
Para la práctica: Continuar como ahora (ya asumimos esto).
La Clase BPP (Bounded-Error Probabilistic Polynomial)
Motivación: Algoritmos Probabilísticos
Algunos problemas son más fáciles si permitimos aleatorización:
Ejemplo: ¿Es $n$ primo?
- Determinista: Algoritmo AKS (2002) — polinomial pero lento: $O((\log n)^{12})$
- Probabilístico: Miller-Rabin — $O(k (\log n)^3)$ con error $\leq 2^{-k}$
Para $k = 100$: error $< 2^{-100}$ (esencialmente 0) y mucho más rápido.
Definición de BPP
$$\mathbf{BPP} = {L \mid L \text{ decidible en tiempo polinomial probabilístico con error acotado}}$$
Formalmente: Existe MT probabilística $M$ que corre en tiempo polinomial tal que:
$$\begin{cases} x \in L \implies P[M \text{ acepta } x] \geq 2/3 \ x \notin L \implies P[M \text{ rechaza } x] \geq 2/3 \end{cases}$$
Notas:
- Error $\leq 1/3$ en ambas direcciones
- Podemos reducir error a $2^{-k}$ repitiendo $O(k)$ veces
- Constante 2/3 es arbitraria (cualquier $> 1/2$ funciona)
Tipos de Algoritmos Probabilísticos
1. Monte Carlo
- Tiempo polinomial siempre
- Puede dar respuesta incorrecta con probabilidad baja
Ejemplo: Miller-Rabin para primalidad
2. Las Vegas
- Respuesta siempre correcta
- Tiempo esperado polinomial (puede tomar más tiempo raramente)
Ejemplo: Quicksort con pivote aleatorio
BPP: Enfocado en Monte Carlo.
Ejemplos en BPP
✅ 1. Primality Testing
- Algoritmo: Miller-Rabin
- Error: $\leq 2^{-k}$ en $k$ rondas
- Complejidad: $O(k (\log n)^3)$ ✓
✅ 2. Polynomial Identity Testing
- Problema: ¿$P(x) \equiv 0$ para polinomio multivariado?
- Algoritmo: Evaluar en puntos aleatorios (Schwartz-Zippel)
- Error: Pequeño
- Aplicación: Verificar multiplicación de matrices
✅ 3. Aproximación de #SAT
- Contar número de asignaciones satisfactorias
- Algoritmo: Sampleo Monte Carlo
- Da aproximación con alta probabilidad
Relaciones entre Clases
┌─────────────────┐
│ NP │
│ │
│ ┌──────┐ │
│ │ BPP? │ │
│ └──┬───┘ │
│ │ │
└───────┼─────────┘
│
┌───▼──┐
│ P │
└──────┘
Lo que sabemos:
- $\mathbf{P} \subseteq \mathbf{BPP}$ (algoritmo determinista = probabilístico con error 0)
- $\mathbf{BPP} \subseteq \mathbf{NP}$ (probablemente, no demostrado)
Conjetura mayoritaria: $\mathbf{P} = \mathbf{BPP}$
Razones:
- Todos los problemas en BPP conocidos tienen algoritmos deterministas (después de mucho esfuerzo)
- Derandomización parece posible en general
- Pero no hay prueba
Implicación: La aleatoriedad quizás no añade poder computacional, solo eficiencia práctica.
BPP en la Práctica
Ventajas de algoritmos probabilísticos:
- ✓ Más simples
- ✓ Más rápidos
- ✓ Más fáciles de paralelizar
Desventajas:
- ✗ No garantía absoluta de corrección
- ✗ Dependen de aleatoriedad de calidad
En la práctica: Ampliamente usados (hashing, ML, criptografía, simulaciones).
Otras Clases de Complejidad (Breve Mención)
PSPACE
$$\mathbf{PSPACE} = {L \mid L \text{ decidible en espacio polinomial}}$$
Ejemplos:
- Juegos (ajedrez, Go en tableros n×n)
- Quantified Boolean Formulas (QBF)
Relaciones: $$\mathbf{P} \subseteq \mathbf{NP} \subseteq \mathbf{PSPACE}$$
EXPTIME
$$\mathbf{EXPTIME} = {L \mid L \text{ decidible en tiempo } 2^{poly(n)}}$$
Ejemplos:
- Algunos juegos generalizados
- Lógica de primer orden
Sabemos: $\mathbf{P} \neq \mathbf{EXPTIME}$ (¡esto SÍ está demostrado!)
Pero no sabemos si $\mathbf{NP} \neq \mathbf{EXPTIME}$ o $\mathbf{P} \neq \mathbf{PSPACE}$.
La Jerarquía Completa
┌──────────────────────────────┐
│ No Computable │
│ (ej: Halting Problem) │
└──────────────────────────────┘
↑
┌──────────────────────────────┐
│ Computable │
│ │
│ ┌────────────────────┐ │
│ │ EXPTIME │ │
│ │ │ │
│ │ ┌──────────────┐ │ │
│ │ │ PSPACE │ │ │
│ │ │ │ │ │
│ │ │ ┌────────┐ │ │ │
│ │ │ │ NP │ │ │ │
│ │ │ │ ┌───┐ │ │ │ │
│ │ │ │ │ P │ │ │ │ │
│ │ │ │ └───┘ │ │ │ │
│ │ │ └────────┘ │ │ │
│ │ └──────────────┘ │ │
│ └────────────────────┘ │
└──────────────────────────────┘
Sabemos: $\mathbf{P} \subseteq \mathbf{NP} \subseteq \mathbf{PSPACE} \subseteq \mathbf{EXPTIME}$
NO sabemos: Si alguna contención es estricta (excepto $\mathbf{P} \neq \mathbf{EXPTIME}$).
Resumen
| Clase | Definición | Intuición | Ejemplos |
|---|---|---|---|
| P | Decidible en tiempo polinomial determinista | “Eficientemente resoluble” | Ordenar, búsqueda, caminos |
| NP | Verificable en tiempo polinomial | “Fácil de verificar” | SAT, TSP, Clique |
| NP-Completo | Los más difíciles de NP | “Si resuelves uno, resuelves todos” | SAT, TSP, 3-Color |
| BPP | Decidible probabilísticamente con error acotado | “Rápido con aleatoriedad” | Primalidad, PIT |
La gran pregunta: ¿$\mathbf{P} = \mathbf{NP}$? ($1,000,000 para quien la resuelva)
Siguiente: Síntesis Final →