Ir al contenido

Decibilidad y Complejidad

8.1 Conceptos Básicos: ¿Qué puede hacer una máquina?

Sección titulada «8.1 Conceptos Básicos: ¿Qué puede hacer una máquina?»

Antes de medir el tiempo, medimos si es posible hacerlo.

  • Función Computable: Una función ff es computable en un dominio si existe una MT que computa el valor de ff para todos los argumentos del dominio
  • Problema Decidible: Es un problema cuya respuesta es binaria (SÍ/NO).
    • Es decidible si existe una MT da la respuesta correcta (SÍ o NO) para cualquier entrada.
    • Si la máquina se queda en bucle infinito para alguna entrada, el problema NO es decidible.

8.2 El Problema de la Parada (Halting Problem)

Sección titulada «8.2 El Problema de la Parada (Halting Problem)»

El ejemplo clásico de problema Indecidible.

Planteamiento: Queremos diseñar una “Super-Máquina” HH que analice a cualquier otra máquina MM con una entrada ww y nos diga si MM se va a colgar (bucle) o si terminará.

Definición formal de la Máquina H (si existiera): Entrada: wMw_M (código de la máquina) y ww (datos).

  • q0wMwx1qyx2q_0 w_M w \vdash^* x_1 q_y x_2 \rightarrow Si MM se para con ww. (Salida: SÍ)
  • q0wMwx1qnx2q_0 w_M w \vdash^* x_1 q_n x_2 \rightarrow Si MM no se para con ww. (Salida: NO)

Conclusión Teórica:

  • No existe ninguna MT HH que pueda hacer esto para todos los casos.
  • Por tanto, el Problema de la Parada es Indecidible.

Nota importante para test: Si el problema de la parada fuera decidible, todos los Lenguajes Recursivamente Enumerables (LRE) se convertirían automáticamente en Lenguajes Recursivos (LRC). Como no lo es, LRE \neq LRC.

8.3 Complejidad Computacional (Medir el coste)

Sección titulada «8.3 Complejidad Computacional (Medir el coste)»

Una vez sabemos que un problema se puede resolver, preguntamos: ¿Cuánto cuesta?

  • Medida: Usamos el tamaño del problema (nn) y medimos cuánto aumenta el tiempo al crecer nn.
  • Notación: Usamos el orden de magnitud O(…) (O grande), no el tiempo exacto en segundos.
  • Tiempo T(n): Una MT resuelve un problema en tiempo T(n)T(n) si no hace más de T(n)T(n) movimientos.

En decidibilidad (teoría pura), todas las MT son iguales. En complejidad (eficiencia), NO. El número de cintas cambia la velocidad.

Ejemplo: L={anbnn1}L = \{ a^n b^n \mid n \ge 1 \}

  • MT Estándar (1 cinta): Tarda O(n2)O(n^2). (Tiene que ir y volver muchas veces).
  • MT con 2 cintas: Tarda O(n)O(n). (Puede copiar y comparar en una sola pasada).

8.4 Clases de Complejidad: Determinismo vs No Determinismo

Sección titulada «8.4 Clases de Complejidad: Determinismo vs No Determinismo»

Aquí definimos qué tan difícil es un problema según el tipo de máquina.

  • TD(T(n)): Tiempo Determinista. Lo que tarda una MT normal (sin “magia”). Es aceptado por una MT multicinta determinista en tiempo polinómico.
  • TND(T(n)): Tiempo No Determinista. Lo que tarda una MT No Determinista (que puede “adivinar” el camino correcto). Es aceptado por una MT multicinta no determinista en tiempo polinómico.
  • Regla: TD(T(n))TND(T(n))TD(T(n)) \subseteq TND(T(n)). (El determinismo es un caso particular del no determinismo).

Dada una fórmula lógica (ej: (x1x2)¬x1(x_1 \lor x_2) \land \neg x_1), ¿existe una combinación de True/False que la haga verdadera?

  • MT Determinista: Tiene que probar todas las combinaciones. Coste exponencial: O(2n)O(2^n).
  • MT No Determinista: “Adivina” la combinación correcta al instante y solo verifica. Coste lineal: O(n)O(n).

Las siglas que definen la informática teórica moderna:

  • Lenguajes aceptados por MT Determinista en tiempo polinómico (n,n2,n3...n, n^2, n^3...).
  • Son los problemas TRATABLES (viables de resolver).
  • Fórmula: TD(ni)\bigcup TD(n^i)
  • Lenguajes aceptados por MT No Determinista en tiempo polinómico.
  • Son problemas que quizás son difíciles de resolver (como SAT), pero muy rápidos de verificar si te dan la solución.
  • Fórmula: TND(ni)\bigcup TND(n^i)
  1. PNPP \subseteq NP (Todo problema fácil de resolver es fácil de verificar).
  2. ¿P = NP? La gran pregunta del millón. No se sabe.
  3. Tesis de Cook-Karp:
    • Clase P = Problemas Tratables.
    • Fuera de P = Problemas Intratables (requieren tanta memoria/tiempo que son inviables para nn grande).

¿Cómo clasificamos los problemas más difíciles? Usamos la Reducción.

Reducción en tiempo polinomial (L1L_1 se reduce a L2L_2)

Sección titulada «Reducción en tiempo polinomial (L1L_1L1​ se reduce a L2L_2L2​)»

Significa que podemos transformar cualquier input de L1L_1 en un input de L2L_2 rápidamente (tiempo polinómico).

  • Lógica: Si L1L_1 se puede transformar en L2L_2 fácilmente, entonces L2L_2 es “igual o más difícil” que L1L_1.
  • Propiedad Clave:
    • Si L1L_1 se reduce a L2L_2 y L2PL_2 \in P \Rightarrow entonces L1PL_1 \in P. (Si el difícil resulta ser fácil, el fácil también lo es).

Un lenguaje LL es NP-Completo si cumple dos condiciones:

  1. Pertenece a NP (LNPL \in NP).
  2. Cualquier otro problema de NP se puede reducir a LL.

Es decir, son los problemas más difíciles de toda la clase NP. Si resuelves uno de estos en tiempo polinómico (P), has resuelto todos los problemas de NP (demostrando P=NPP=NP).