Introducción a la Complejidad Computacional
Introducción a la Complejidad Computacional
computacional
PID_00267022
Joaquim Borges
Robert Clarisó
Ramon Masià
Jaume Pujol
Josep Rifà
Joan Vancells
Mercè Villanueva
Mercè Villanueva
Los textos e imágenes publicados en esta obra están sujetos –excepto que se indique lo contrario– a una licencia de
Reconocimiento-NoComercial-SinObraDerivada (BY-NC-ND) v.3.0 España de Creative Commons. Podéis copiarlos, distribuirlos
y transmitirlos públicamente siempre que citéis el autor y la fuente (FUOC. Fundación para la Universitat Oberta de Catalunya),
no hagáis de ellos un uso comercial y ni obra derivada. La licencia completa se puede consultar en [Link]
licenses/by-nc-nd/3.0/es/[Link]
CC-BY-NC-ND • PID_00267022 Complejidad computacional
Índice general
Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1. Concepto de problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1. Problemas decisionales, de cálculo y de optimización . . . . . . . . . 8
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2. Algunos problemas decisionales importantes . . . . . . . . . . . . . . . . . 11
1.2.1. Satisfactibilidad de fórmulas booleanas . . . . . . . . . . . . . . . 12
1.2.2. Partición de conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2. Medidas de complejidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1. Tiempo y espacio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.1. El tamaño de la entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2. Las clases de complejidad P y EXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3. La clase de complejidad NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
?
2.4. Jerarquía de complejidad y la cuestión P = NP . . . . . . . . . . . . . . . . 26
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3. Reducciones y completitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.1. El concepto de reducción polinómica . . . . . . . . . . . . . . . . . . . . . . . . . 30
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2. Propiedades de las reducciones, transitividad
y equivalencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3. Completitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
CC-BY-NC-ND • PID_00267022 Complejidad computacional
Soluciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Ejercicios de autoevaluación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Solucionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
CC-BY-NC-ND • PID_00267022 5 Complejidad computacional
Introducción
1. Concepto de problema
.
Definición 1
Ejemplo 1
Este problema
√ corresponde a una función RC : R+ → R+ , concretamente la función
RC(x) = x. Por ejemplo, tendremos que RC(4) = 2 y RC(5) = 2,2360679.
Ejemplo 2 Secuencia
BUSQUEDA_ORD: “Dada una secuencia finita de enteros E ordenada en orden creciente Una secuencia es una serie de
y un entero k, decidir si el número k aparece en la secuencia.” elementos donde el orden de
los elementos es relevante y
En este caso, cada entrada del problema es un par de valores (una secuencia y un en- puede haber repeticiones: h i,
tero), mientras que la solución es sencillamente SÍ o NO. Formalmente, podríamos de- h3, – 1i, h4,4,15, – 2,5,6i, . . .
finir la función BUSQUEDA_ORD : Z∗ × Z → {SÍ,NO}. Así, tendríamos por ejemplo
que BUSQUEDA_ORD h–2,3,45,50i,3 = SÍ mientras que con otra entrada tenemos que
BUSQUEDA_ORD h5,11,29i,24 = NO. Notación
Dado un conjunto C,
A lo largo de este módulo, veremos muchos ejemplos de problemas compu- llamaremos C∗ al conjunto
de todas las secuencias finitas
tacionales. Algunos de ellos son muy relevantes por sus aplicaciones prácticas
de elementos de C,
y, por lo tanto, es interesante recordarlos y aprender a reconocerlos. Clasifi- incluyendo la secuencia vacía
h i.
caremos el grado de dificultad de estos problemas a partir del análisis de los
algoritmos que calculan su solución.
CC-BY-NC-ND • PID_00267022 8 Complejidad computacional
Definición 2
SÍ
ր
x∈I→ DECISIÓN
ց
NO
Ejemplo 3
Este problema es una función PAR : N → {SÍ,NO}. Por ejemplo, PAR(16) = SÍ y PAR(7) =
NO.
Ejemplo 4
Si llamamos G al conjunto de todos los grafos, podemos definir este problema como la
función CONEXO : G → {SÍ,NO}. Por ejemplo, para los grafos completos Kn tendríamos
que CONEXO(Kn ) = SÍ para cualquier valor de n.
Definición 3
Ejemplo 5
Podemos definir el problema PAR• como el conjunto {0,2,4,6,8,10, . . .}. Podemos expre-
sar que PAR(8) = SÍ como 8 ∈ PAR• y que PAR(11) = NO como 11 6∈ PAR• .
Ejemplo 6
Llamaremos ProbSI a un problema decisional que tiene solución SÍ para cualquier en-
trada. Evidentemente, el conjunto ProbSI• = I, ya que todas las entradas pertenecen a
ProbSI• . En cambio, si un problema tiene solución NO para cualquier entrada se llama
ProbNO y está claro que ProbNO• = ∅. ProbSI y ProbNO nos serán útiles para obtener
algunos resultados teóricos a lo largo de este módulo.
Definición 4
Ejemplo 7
Ejemplo 8 Notación
AISLADOS: “Dado un grafo G = (V,A), determinar el conjunto de vértices de grado cero Si C es un conjunto, 2C
(aislados).” representa el conjunto
formado por todos los
El problema AISLADOS : G → 2V es de cálculo porque tiene como solución un subcon- subconjuntos de C.
junto de los vértices V del grafo que no tienen ninguna arista incidente. Por ejemplo,
para los grafos completos Kn tenemos que AISLADOS(Kn ) = ∅ para cualquier n. En cam-
bio, en los grafos nulos Nn todos los vértices son aislados, es decir, AISLADOS(Nn ) = V.
CC-BY-NC-ND • PID_00267022 10 Complejidad computacional
Definición 5
Ejemplo 9
CPP: “Dado un conjunto de puntos en un espacio bidimensional, donde cada punto está
definido por las coordenades (x,y), calcular el par de puntos que son más próximos entre Nomenclatura
sí.”
En inglés, este problema se
Este problema puede verse como una función CPP : 2R×R → (R × R) × (R × R). Un ejem- llama closest pair problem.
solución sería la que se muestra a continuación: CPP {(0,10),(5,20),(–2,0),(30, –
plo de
50)} = (0,10),(–2,0) .
Ejemplo 10
LCS: “Dadas dos cadenas de caracteres a y b, encontrar la subcadena común más larga
entre a y b.” Nomenclatura
Si Σ es el alfabeto de símbolos sobre el que hemos definido las cadenas de caracteres, En inglés, este problema se
podemos describir LCS como la función LCS : Σ∗ × Σ∗ → Σ∗ . Un ejemplo de solución llama longest common
sería LCS(“andromeda”, “dromedary”) = “dromeda”. substring.
Ejemplo 11
Este problema tiene como entrada un grafo G = (V,A) y una función de ponderación, y En inglés, este problema se
como solución un grafo. Es decir, podemos describirlo como la función MSP : G × (A → llama minimum spanning tree.
R) → G. La función de valoración en este caso es el peso del árbol generador, que se
pretende minimizar.
Ejercicios
e) Dada una cadena de caracteres c, indicar si contiene todos los dígitos del 0 al 9.
2. Justificad si son ciertas o falsas las afirmaciones siguientes (repasad el ejemplo 5):
a) Si un grafo G es un árbol, entonces G 6∈ CONEXO• .
Soluciones
2. a) Falsa. Por definición, todos los árboles son grafos conexos y por lo tanto CONEXO(G) =
SÍ. Para ser correcta, la afirmación debería decir G ∈ CONEXO• .
b) Cierta. Aunque un número sea impar (PAR(x) = NO), el doble de cualquier número siem-
pre será par (PAR(2x) = SÍ).
Podemos ver que la versión decisional es “más sencilla” que el problema origi-
nal de cálculo o optimización: el algoritmo que resuelve el problema original
puede solucionar también la versión decisional. Así pues, si demostramos que
la versió decisional es “difícil”, tendremos que las versiones de cálculo y op-
timización también lo son. Es decir, estudiar la complejidad de los problemas
CC-BY-NC-ND • PID_00267022 12 Complejidad computacional
Definición 6
Una variable booleana es una variable que puede tomar los valores de
verdad 0 (falso) o 1 (cierto).
Ejemplo 12
(a ∧ b ∧ c) ∨ (a ∧ c) ∨ b
contiene 5 literales sin negar y uno negado (b). Podemos ver que no está en FNC: no
es la conjunción de cláusulas, sino una disyunción de conjunciones. Para estar en FNC
debería tener una forma como
(a ∨ b ∨ c) ∧ (a ∨ c) ∧ b.
Esta última fórmula tiene 3 cláusulas: una de 3 literales, una de 2 y una de 1 literal. Si se
evalúa la fórmula, por ejemplo, para a = 1, b = 1 y c = 0 el resultado es 1 y para a = 0, b =
1 y c = 0 el resultado es 0.
CC-BY-NC-ND • PID_00267022 13 Complejidad computacional
Problema de decisión 7
Ejemplo 13
Dada la fórmula f = (a ∨ b) ∧ (a ∨ c), tenemos que SAT(f ) = SÍ. De hecho, de las 23 asig-
naciones de valores de verdad a las variables {a,b,c}, hay 5 asignaciones que satisfacen la
fórmula:
a b c
0 0 0
0 0 1
0 1 0
0 1 1
1 1 0
(a ∨ b ∨ c) ∧ (a ∨ c) ∧ b ∧ (a ∨ c) ∧ (a ∨ d) ∧ (c).
Ejemplo 14
Tres profesores (Pilar, Ricardo y María) tienen que vigilar tres exámenes (1, 2 y 3). Cada
examen debe tener al menos un vigilante, aunque también puede tener más de uno.
A Ricardo no le va bién el horario del primer examen, y el segundo y el tercero están
solapados y se tienen que asignar a personas diferentes. Finalmente, cada profesor debe
vigilar al menos un examen.
Queremos decidir si hay alguna asignación de vigilancias de examen factible. Este pro-
blema es equivalente a decidir si la fórmula siguiente es satisfactible (pi = 1 indica que
Pilar vigila el examen i-ésimo y similarmente para Ricardo y María).
CC-BY-NC-ND • PID_00267022 14 Complejidad computacional
. Multiconjunto
Ejemplo 15
Podemos ver que PARTICION [2,3,3,34] = NO. Para justificarlo, tenemos que comprobar
que ninguna partición del conjunto tiene la misma suma. En un multiconjunto con n
elementos, hay como máximo 2n–1 particiones (asumiendo que la mitad de particiones
son simétricas, es decir, que de una partición a la otra sólo se intercambian C′ y C \ C′ ):
C′ Suma de C′ C \ C′ Suma de C \ C′
∅ 0 [2,3,3,34] 42
[2] 2 [3,3,34] 40
[3] 3 [2,3,34] 39
[34] 34 [2,3,3] 8
[2,3] 5 [3,34] 37
[3,3] 6 [2,34] 36
En cambio PARTICION [3,4,12,17,18,22,28] = SÍ, ya que tenemos dos subconjuntos con
suma total 52, [3,4,28,17] y [22,18,12].
Ejemplo 16
Nomenclatura
Un notario tiene que dividir un conjunto de obras de arte dejadas en herencia a dos he-
rederos. En primer lugar, necesita decidir si hay algún reparto equitativo. Este problema En inglés, el problema
se puede ver como una instancia de PARTICION, donde el valor monetario de cada obra PARTICION se llama
sería un valor entero dentro del multiconjunto. partition.
Ejemplo 17
Un array de discos debe almacenar una lista de ficheros en dos discos y es necesario de-
cidir dónde se guarda cada fichero. Se desea que la ocupación de cada disco sea lo más
equilibrada posible. Este problema vuelve a ser una instancia de la versión de optimi-
zación de PARTICION, donde el espacio ocupado por cada fichero es un valor entero
dentro del multiconjunto a particionar.
. Nomenclatura
X
SUMA_SUB(C,t) ≡ ∃C′ ⊆ C : x=t
x ∈ C′
Ejemplo 18
Tenemos que SUMA_SUB {1,9,10,17,20},48 = SÍ, yaque {1, 10, 17, 20} tiene como suma
total 48. En cambio, SUMA_SUB {1,9,10,17,20},35 = NO, aunque para comprobarlo
deberíamos estudiar los 25 = 32 subconjuntos del conjunto original.
Ejemplo 19
Queremos comprar un producto de una máquina expendedora que sólo acepta el impor-
te exacto. Para hacerlo, tenemos en nuestra cartera un puñado de monedas. Si todas las
monedas tienen un valor diferente, decidir si podemos comprar el producto es una ins-
tancia de SUMA_SUB, donde C es el conjunto de valores de las monedas y t es el precio
del producto.
Ejercicios
a ∧ b, a ∨ b, (a ∨ b), (a ∨ b) ∧ b ∧ a, a ∨ (b ∧ c)
4. ¿Hay alguna fórmula booleana en FNC con exactamente dos cláusulas que sea insatisfac-
tible? Y si además esta fórmula tuviera que ser una entrada de 3SAT, ¿cambiaría la respuesta?
CC-BY-NC-ND • PID_00267022 16 Complejidad computacional
(a ∨ b ∨ c), (a ∨ b ∨ c) ∧ (a ∨ b), (a ∨ c) ∨ (b ∧ c) ∨ (b ∧ c)
6. Indicad si las siguientes fórmulas en FNC son satisfactibles y, si lo son, calculad una asig-
nación de valores de verdad que las satisface:
a) x ∧ (x ∨ y) ∧ z ∧ (x ∨ y ∨ z)
b) (y ∨ z) ∧ (x ∨ z) ∧ (x ∨ y)
8. Dadas las siguientes entradas de PARTICION, indicad cuál es su solución. En caso de que
la solución sea SÍ, indicad cuál sería la partición.
a) C1 = [1,2,3,4,5,6,7,8,9,10,11].
b) C2 = [18,175, – 64,14,13].
Soluciones
4. Sí: (a ∧ a). En cambio, si la fórmula es una entrada de 3SAT, todas las fórmulas con 2
cláusulas serán siempre satisfactibles.
5. Sólo (a∨b∨c), ya que tiene 3 literales en todas las cláusulas (en este caso, su única cláusula).
(a ∨ b ∨ c) ∧ (a ∨ b) tiene una cláusula con 2 literales mientras que (a ∨ c) ∨ (b ∧ c) ∨ (b ∧ c) ni
siquiera está en FNC.
6. a) No es satisfactible.
7. Si PARTICION(C) = SÍ, quiere decir que C se puede dividir en dos partes con la misma
suma total. Si llamamos s a la suma de los elementos de cada una de estas partes, la suma de
todos los elementos de C será 2s que es un número par.
b) PARTICION(C2 ) = NO. Fijémonos que 175 – 64 es más grande que la suma del resto de
enteros positivos.
CC-BY-NC-ND • PID_00267022 17 Complejidad computacional
2. Medidas de complejidad
.
Definición 10
Ejemplo 20
Un cuadrado mágico es una matriz n × n de números naturales que contiene los números
del 1 al n2 sin repeticiones y de forma que la suma de cada fila, columna y diagonal
principal es igual al mismo valor. Un ejemplo de cuadrado mágico 3 × 3 es la matriz
8 3 4
1 5 9
6 7 2
hacer (2n + 2)(n – 1) sumas. Después es necesario comparar los resultados entre sí, es decir,
es necesario hacer 2n + 1 comparaciones. En resumen, la complejidad temporal es O(n2 ).
Definición 11
Definición 12
Definición 13
Ejemplo 22
En los algoritmos de ordenación, la entrada está formada por una lista o secuencia de
números enteros y la complejidad se calcula en función de la longitud (número n de
elementos) de la lista.
En caso que la entrada del algoritmo sea un número entero es importante fijar
la base con la que representaremos el número. Un número como 101 puede
estar en base 2,3, . . . ,10, . . . y su representación interna en un ordenador es
diferente según sea la base. Nosotros supondremos que todos los números
enteros están representados en base 2, que es la forma como se representan en
un ordenador.
Definición 14
Ejemplo 23 Criptografía
El número entero 101 en base 10 se representa como 1100101 en base 2. El número de En muchos protocolos
bits de su representación binaria es ⌊log2 101⌋ + 1 = 7. Por lo tanto, el tamaño de la criptográficos, la
entrada será n = 7. confidencialidad se garantiza
a través del tamaño de una
clave. Por ejemplo, con claves
Ejemplo 24 de 1024 bits se pueden
requerir del orden de
Supongamos que nos piden calcular la complejidad del algoritmo que suma los N (N ≥ 21024 ≈ 10308 operaciones
1) primeros números naturales. Este problema ya se trató antes* y habíamos deducido matemáticas para descifrar
que si sumábamos los N números consecutivamente entonces el algoritmo tenía una un mensaje sin tener la clave.
complejidad O(N). Si N es pequeño, entonces este cálculo se puede considerar correcto.
¿Qué pasa si N es muy grande, por ejemplo, si N es un número de 1024 bits? Entonces
es más adecuado expresar la complejidad del algoritmo en función de la longitud de
la representación binaria de N y no directamente con el valor de N. Así pues, como la
longitud binaria es n = ⌊log2 N⌋+1, este algoritmo pasaría a tener una complejidad O(2n ), *Ved el subapartado 2.2 del
dado que hay 2n números enteros diferentes de tamaño menor o igual que n. módulo “Conceptos previos:
funciones y algoritmos”.
Fijaos que este resultado pone en evidencia que este algoritmo es muy ineficiente. ¿Po-
demos pues afirmar que el problema de sumar los N primeros números naturales es un
problema intratable? Esto tampoco es cierto ya que en el módulo “Conceptos previos:
funciones y algoritmos”, habíamos visto otro algoritmo para calcular esta suma. El algo-
ritmo, propuesto por Gauss, es muy eficiente ya que tiene una complejidad polinómica
(sólo realiza una suma, un producto y una división por 2). Por lo tanto, la existencia del
algoritmo de Gauss nos confirma que este problema es tratable.
Ejercicios
9. Tenemos un algoritmo con complejidad temporal O(n2 ). ¿Qué podemos decir sobre su
complejidad espacial?
10. Tenemos un algoritmo con complejidad espacial O(n). ¿Qué podemos decir sobre su
complejidad temporal?
11. ¿Puede existir un algoritmo de complejidad temporal O(2n ) y complejidad espacial O(n)?
CC-BY-NC-ND • PID_00267022 21 Complejidad computacional
13. ¿Por qué en las definicions de problemas tratables e intratables no se limita la compleji-
dad espacial?
2
15. Tenemos un problema resoluble en tiempo O(2n ). ¿Es intratable?
16. Sea N (N > 0) un número entero y sea A un algoritmo que tiene como entrada el número
entero N. Calculad, en función de la longitud de la representación binaria de N, la comple-
jidad del algoritmo A para cada uno de los casos siguientes:
Soluciones
9. La complejidad espacial será como mucho O(n2 ), pero podría ser inferior.
10. Es como mínimo O(n), pero es posible que hagan falta más de O(n) pasos de cálculo para
llegar a la solución.
11. Sí.
12. No, porque este algoritmo no realiza suficientes pasos para poder leer o escribir toda la
memoria que supuestamente consume.
13. No se impone explícitamente ninguna restricción sobre el espacio porque las restriccio-
nes ya vienen implícitas por la complejidad temporal: si un problema es resoluble en tiempo
polinómico, necesariamente es resoluble en espacio polinómico, y pasa lo mismo con tiem-
po exponencial.
14. Sí, ya que es resoluble en tiempo polinómico: aunque el exponente del polinomio sea
una constante muy grande, el coste O(n100 ) sigue siendo polinómico.
15. No lo sabemos. Sabemos que es resoluble en tiempo exponencial, pero para ser intrata-
ble, nos faltaría asegurar que no es resoluble en tiempo polinómico. Que haya una solución
con complejidad exponencial, no significa que no pueda haber otra de complejidad polinó-
mica.
Definición 15
Definición 16
Ejemplo 25
Explosión combinatoria
Muchos de los problemas decisionales que conocemos pertenecen a las clases P y PSPACE.
Algunos ejemplos de problemas en estas clases serían: decidir si un número es par, si un Explosión combinatoria es el
grafo es conexo o si un vector de enteros está ordenado en orden creciente. término utilizado para
referirse al rápido crecimiento
Pondremos un ejemplo de problema que no pertenece a la clase P, el problema AJEDREZ: del número de posibles
“Dada una configuración de un tablero de ajedrez, determinar si un jugador tiene una se- soluciones respecto al
cuencia de jugadas ganadora a partir de esta configuración”. Para resolver este problema tamaño de la entrada.
es necesario explorar el árbol de posibles jugadas para los dos jugadores, que puede ser de
un tamaño exponencial respecto al tamaño del tablero. A partir de este razonamiento,
es posible demostrar que el problema AJEDREZ pertenece a . Este problema también
se puede definir para otros juegos como las damas o el go, con la misma complejidad
temporal.
CC-BY-NC-ND • PID_00267022 23 Complejidad computacional
Ejemplo 26
Entscheidungsproblem
Hay muchos otros problemas que se han clasificado dentro de las clases o EXPSPACE,
por ejemplo en el contexto de la lógica: comprobar si una propiedad expresada mediante
Entscheidungsproblem (en
una fórmula lógica es satisfactible puede requerir tiempo y/o espacio exponencial, en
castellano, problema de
función de la expresividad del lenguaje lógico utilizado (operadores lógicos permitidos,
decisión) es el nombre alemán
existencia de cuantificadores, . . . ).
oficial para el problema LPO.
En el año 1936, Alan Turing y
En el caso de la lógica también encontramos ejemplos de problemas que están fuera de
Alonzo Church demostraron
las clases y EXPSPACE. Por ejemplo, consideremos la lógica de primer orden, donde se
de forma independiente su
permite utilizar los cuantificadores universal (∀) y existencial (∃). Definimos el proble-
indecidibilidad. Sus
ma LPO de la forma siguiente: “Dada una fórmula f escrita en lógica de primer orden,
demostraciones definían un
decidir si f es un teorema”. Es decir, dada una fórmula f , nos planteamos si se puede
modelo abstracto de cálculo,
demostrar a partir de los axiomas de la lógica de primer orden. Resulta que el problema
la máquina de Turing y el
LPO es indecidible: no hay ningún procedimiento que resuelva LPO en tiempo finito
λ-cálculo respectivamente.
para cualquier entrada. Es decir, si proponemos un algoritmo para resolver este proble-
Este resultado fue
ma, necesariamente habrá algunas entradas para las que no podrá dar respuesta ni SÍ ni
revolucionario: ¡algunos
NO, porque requeriría un tiempo de cálculo infinito.
problemas no se pueden
resolver en tiempo finito!
Otro problema indecidible famoso es el problema de la parada: “Dado un programa Prog
y unos datos de entrada x, decidir si la ejecución de Prog con entrada x acaba en un
tiempo finito”. Este problema, pues, queda fuera del alcance de las clases de complejidad
que estudiamos en este módulo. Los problemas indecidibles los estudia otra rama de la
Informática Téorica, la Teoría de la Calculabilidad.
Ejemplo 27
Definición 17
Definición 18
Ejemplo 28
Cada entrada de este problema es una secuencia finita de enteros (I = Z∗ ). Para definir la
función verificadora, necesitamos elegir un conjunto de testigos T apropiado. El testigo
nos tendría que permitir comprobar que DUPL(A) = SÍ sin generar falsos positivos cuando
DUPL(A) = NO.
Intuitivamente, para demostrar que hay algún valor repetido en un vector es suficiente
indicar dos posiciones del vector con el mismo contenido. Por lo tanto, T sería el con-
junto de pares de números naturales (T = N × N) y cada testigo sería un par de posiciones
(i,j) del vector. La función de verificación v(A,(i,j)) se definiría de la forma siguiente:
SÍ Si i 6= j ∧ A[i] = A[j]
v(A,(i,j)) =
NO En otro caso.
Fijémonos que esta propuesta de función verificadora satisface las propiedades requeri-
das:
• Si DUPL(A) = SÍ (hay algún valor duplicado), existe un testigo (i,j) tal que A[i] = A[j].
Por ejemplo, para A = (3,4,17,4) el testigo (2,4) nos permitiría verificar que A[2] =
A[4].
Ejemplo 29
Para el problema SAT (problema de decisión 7), cada entrada es una fórmula booleana en
FNC. Un testigo sería una asignación de valores de verdad a las variables de la fórmula,
concretamente la asignación que satisface la fórmula.
A partir de una fórmula de entrada satisfactible y este testigo, se puede verificar que la
fórmula es satisfactible en tiempo polinómico: sólo es necesario comprobar que cada
cláusula evalúa a 1 según la asignación de valores de verdad del testigo.
Ejemplo 30
Además, siP
P PARTICION(C) = NO tenemos que ningún subconjunto C′ de C cumplirá
x∈C′ x = x∈C\C′ x. Por lo tanto, no hay ningún testigo que permita verificar errónea-
mente una entrada con solución NO.
. Nomenclatura
Ejercicios
17. Demostrad que los siguientes problemas se pueden verificar en tiempo polinómico:
a) Dado un número entero positivo x, decidir si es un número compuesto (tiene dos divisores
diferentes de 1 y él mismo).
b) Dado un grafo G = (V,A) y un vértice v del grafo (v ∈ V), decidir si v forma parte de algún
ciclo dentro del grafo.
c) Dado un grafo G = (V,A), decidir si el grafo tiene al menos tres componentes conexas.
Ved también
18. Si un problema decisional pertenece a P, entonces seguro que pertenece a NP. ¿Cierto o
falso?
En el subapartado 4.2 del
19. Consideremos el problema decisional “Dado un grafo ponderado (G,ω), decidir si con- módulo “Recorridos y
tiene algún camino de longitud 100 o más”. Un posible testigo es un par de vértices (v1 ,v2 ), connectividad”, hemos visto
correspondientes a la arista de más peso del grafo G. ¿Cierto o falso? que el problema de encontrar
el camino más corto en un
grafo es un problema
tratable, resuelto por los
algoritmos de Dijkstra y
Soluciones Floyd. Pero,
sorprendentemente, el
problema de encontrar el
17. a) Un posible testigo sería un par de números enteros positivos y y z. Para comprobar el camino más largo en un
testigo, sería necesario ver que x = y · z y que y 6= 1, y 6= x. Si el número de entrada x se grafo ponderado es un
puede representar en n bits, el producto de y y z se puede realizar en tiempo O(n2 ) y la problema intratable.
comparación con 1 y x se puede hacer en tiempo O(n).
en la lista y que el último vértice de la lista es adyacente al primero. Dado que la lista
puede tener, como mucho, todos los vértices del grafo (n), la comprobación se puede
hacer en tiempo O(n log n) si el grafo se representa mediante una matriz de adyacencia.
c) Un posible testigo sería una terna de tres vértices (v1 ,v2 ,v3 ), uno de cada componente
conexa. Para comprobar el testigo, sería necesario comprobar que no hay ningún camino
entre v1 y v2 , entre v1 y v3 ni entre v2 y v3 . Podemos descubrir que estos vértices no estan
conectados asignando un peso unitario a cada arista del grafo G y aplicando el algoritmo
de Floyd: el camino más corto entre los tres vértices debería tener longitud infinita, por
lo tanto, la verificación del testigo se puede hacer en tiempo O(n3 ).
18. Cierto. El mismo algoritmo que resuelve el problema permite verificar el resultado SÍ a
partir de la entrada en tiempo polinómico.
19. Falso. Este testigo sólo permite certificar la respuesta SÍ en los casos donde la arista de
más peso del grafo tiene un peso más grande o igual que 100. Si el peso más grande de las
aristas del grafo es menor que 100, puede haber un camino que pase por diversas aristas
hasta superar el peso límite de 100.
?
2.4. Jerarquía de complejidad y la cuestión P = NP
Propiedad 20
P ⊆ NP ⊆ PSPACE ⊆ ⊆ EXPSPACE
P⊂
PSPACE ⊂ EXPSPACE
EXPSPACE
PSPACE
NP
Por otro lado, la inclusión P ⊂ indica que hay problemas resolubles en tiempo exponen-
cial y que no son resolubles en tiempo polinómico. Son los problemas que hemos llamado
intratables. Un ejemplo sería el problema AJEDREZ que hemos descrito en el ejemplo 25.
No demostraremos las inclusiones PSPACE ⊂ EXPSPACE y PSPACE ⊆ . Sólo resaltare-
mos esta última propiedad, que nos indica una relación nada evidente: cualquier problema
resoluble en espacio polinómico es resoluble en tiempo exponencial.
Ejemplo 32
El problema PAR descrito en el ejemplo 3 pertenece a la clase P. Por lo tanto, sin ne-
cesidad de más información, ya sabemos que PAR también pertenece a las clases NP,
PSPACE, y EXPSPACE.
Ejemplo 33
Ejemplo 34
Ejercicios
20. Para cada uno de los siguientes problemas, indicad a qué clases de complejidad debe
pertenecer necesariamente, a cuáles puede pertenecer y a cuáles seguro que no pertenece:
a) Un problema que se puede resolver en espacio O(n3 ).
24. Tenemos un problema de NP que se puede resolver en tiempo polinómico. ¿Quiere decir
esto que P = NP?
Soluciones
20. Fijémonos que el hecho de que haya una determinada solución no impide que haya otras
más o menos eficientes, a menos que el enunciado lo indique explícitamente. Otro aspecto
relevante a destacar es que la verificación en tiempo exponencial no nos aporta información
sobre la clase de complejidad de un problema.
CC-BY-NC-ND • PID_00267022 29 Complejidad computacional
21. Falso. P y NP son dos subclases de PSPACE y el hecho que sean iguales entre sí no nos
indica nada respecto a la superclase PSPACE.
23. Cierto. Sabemos que P ⊂ , y como ⊆ EXPSPACE podemos concluir que P 6= EXPSPACE.
24. Esto no quiere decir que P = NP. Dado que P ⊆ NP, es normal encontrar dentro de
NP problemas que se pueden resolver en tiempo polinómico, es decir, problemas de P. Para
demostrar que P = NP sería necesario demostrar que todos los problemas de NP se pueden
resolver en tiempo polinómico.
CC-BY-NC-ND • PID_00267022 30 Complejidad computacional
3. Reducciones y completitud
.
Ejemplo 25
. Atención!
Ejemplo 36
SÍ
x+1 PAR ր
x ∈ N –→ –→ x + 1 ∈ N –→
ց
NO
Fijémonos que este algoritmo calculará la solución correcta para todas las entradas del
problema IMPAR, es decir, que IMPAR(x) = PAR(x + 1) para cualquier x. De cara a demos-
trar esta igualdad, es necesario considerar dos tipos de entradas: las que tienen solución
SÍ y las que tienen solución NO.
Cierto. Como x es un número impar, entonces x+1 será par (PAR(x+1) = SÍ). Tenemos
pues que IMPAR(x) = PAR(x + 1).
En este caso, la función de reducción utilizada ha sido f (x) = x + 1. Es una función que se
puede calcular en tiempo polinómico y, por lo tanto, podemos decir que IMPAR ≤p PAR.
Ejemplo 37
Supongamos que queremos hacer una reducción de PRIMO (“dado un número natural
x, decidir si tiene exactamente dos divisores: 1 y x”) al problema IMPAR. Proponemos
como función de reducción f (x) = x + 2. Comprobemos si es una reducción correcta:
Vemos pues que f no es una reducción. Intentemos definir una función más complicada
para hacer la reducción de PRIMO a IMPAR que resuelva estos problemas detectados:
2 Si x = 1
g(x) = 3 Si x = 2
x En otro caso.
CC-BY-NC-ND • PID_00267022 32 Complejidad computacional
Cierto. Si un número es primo, entonces tiene que ser impar, con la excepción del 2,
pero la función g ya lo trata como un caso especial: PRIMO(2) = IMPAR(3) = SÍ.
Falso. La igualdad se cumple para x = 4 pero hay números compuestos que son
impares, como por ejemplo 15 = 3 · 5: PRIMO(15) = NO, IMPAR(15) = SÍ.
La función g tampoco nos sirve como reducción, ya que no preserva la solución para las
entradas con solución NO (aunque sí se comporta correctamente para entradas con solu-
ción SÍ). Fijémonos pues que, al definir una reducción, siempre tenemos que comprobar
tanto la solución SÍ como la solución NO por separado.
Ejercicios
25. Sea MULT4 el problema “Dado un número natural x, decidir si es un múltiplo de 4.”
Proponed reducciones polinómicas para IMPAR ≤p MULT4, PAR ≤p MULT4, MULT4 ≤p PAR
y MULT4 ≤p IMPAR y demostrad que son correctas.
26. Sea Prob un problema cualquiera. ¿Podemos definir una reducción Prob ≤p Prob? ¿Qué
función de reducción tendríamos que utilizar?
Soluciones
• MULT4 ≤p PAR: h(x) = (x div 2)(1–(x m«od 2)) , donde div es la división entera y m«
od es el
resto de la división.
Si x es múltiplo de 4, el cociente será un número par y el resto será 0, y por lo tanto
h(x) será par. En cambio, si x no es múltiplo de 4 puede pasar que el resto sea 1 (por
ejemplo, x = 13) o que el cociente sea impar (por ejemplo, para x = 30). Si el resto es
1, independientemente de como sea el cociente, tendremos h(x) = (x div 2)0 = 1 y por
lo tanto h(x) no es un número par. Si el resto es 0 y el cociente es impar, tenemos que
h(x) = (x div 2)1 = x div 2 que como hemos dicho es un número impar. Por lo tanto, si x
no es múltiplo de 4, tenemos que h(x) no es par.
26. La reducción Prob ≤p Prob siempre se puede definir, independientemente de quién sea el
problema Prob. La función de reducción que utilizaríamos sería la función identidad f (x) = x,
que tiene coste constante y garantiza que A(x) = A(f (x)).
27. En primer lugar, podemos ver que f es calculable en tiempo polinómico: se calcularía
haciendo un recorrido sobre el conjunto C, haciendo una suma para cada elemento y, al
final, una resta y un producto.
Ahora nos falta demostrar que SUMA_SUB(C,t) = PARTICION(f (C,t)) para aquellas entradas
con soluciones SÍ y aquellas con solución NO:
• Caso SUMA_SUB(C,t) = SÍ: Hay que demostrar que PARTICION(f (C,t)) = SÍ.
• Caso SUMA_SUB(C,t) = NO: Hay que demostrar que PARTICION(f (C,t)) = NO.
28. La reducción propuesta va bien encaminada pero tiene dos errores. En primer lugar, f
no preserva la solución cuando la suma s tiene un valor impar. Por ejemplo, si C = [3,4,8],
tenemos que PARTICION(C) = NO, pero en cambio SUMA_SUB({3,4,8},7) = SÍ.
Finalmente, la reducción tiene otro error más sutil: el problema PARTICION tiene como en-
trada un multiconjunto de enteros (donde se admiten repeticiones) mientras que SUMA_SUB
espera recibir como entrada un conjunto de enteros (y por lo tanto, no admite repeticiones).
Por lo tanto, la función f (C) = (C,s div 2) no siempre nos retorna una entrada correcta de
SUMA_SUB para cualquier entrada de PARTICION.
El concepto de reducción es muy importante por dos motivos, uno más prác-
tico y otro más teórico.
En primer lugar, las reducciones nos permiten reaprovechar algoritmos cono- ¿El mejor solver?
cidos para la resolución de nuevos problemas. Esta reutilización es especial-
Desde el año 2002, se realiza
mente ventajosa cuando el algoritmo es muy eficiente o cuando su imple- una competición científica
mentación es muy costosa. Por ejemplo, en la actualidad, gran cantidad de anual donde se compara la
eficiencia de los solvers de
problemas complejos se resuelven traduciéndolos a SAT. Los solvers de SAT es- SAT más recientes:
tán muy optimizados, de forma que es más práctico traducir un problema a [Link]
.[Link].
SAT que desarrollar soluciones a medida para cada nuevo problema.
En segundo lugar, una reducción establece una relación entre las complejida-
des de los problemas involucrados. Con A ≤p B, estamos diciendo que una
forma de resolver A es calcular la función de reducción f y después resol-
ver B.
• En una dirección, esto fija una cota superior para la complejidad del pro-
blema A: como máximo, A se puede resolver en el tiempo que se tarda
CC-BY-NC-ND • PID_00267022 34 Complejidad computacional
. Observación
Ejemplo 38
Supongamos que tenemos una reducción SUMA_SUB ≤p PARTICION como la del ejer-
cicio 27. Como sabemos que PARTICION ∈ NP, automáticamente SUMA_SUB ∈ NP. Si
descubriéramos que SUMA_SUB ∈ / P, entonces sabríamos que PARTICION ∈
/ P.
Propiedad 23
Demostración: Para demostrar que existe la reducción A ≤p C, tenemos que construir una
función f calculable en tiempo polinómico tal que A(x) = C(f (x)).
La reducción A ≤p B nos asegura que existe una función g calculable en tiempo poli-
nómico tal que A(x) = B(g(x)). Igualmente, con la reducción B ≤p C, sabemos que hay una
función h calculable en tiempo polinómico tal que B(x) = C(h(x)). La función f que estamos
buscando es precisamente la composición de estas funciones g y h: A(x) = B(g(x)) = C(h(g(x))).
Además, como f (x) = h(g(x)) y g y h tienen complejidad polinómica, f también tiene
complejidad polinómica.
Definición 24
Ejemplo 39
Los problemas IMPAR y PAR son polinómicamente equivalentes entre sí. Curiosamente,
la misma función f (x) = x + 1 que hace la reducción IMPAR ≤p PAR permite hacer
la reducción PAR ≤p IMPAR. Normalmente no tendremos esta suerte y necesitaremos
definir una función de reducción diferente para cada dirección de la reducción.
Ejemplo 40
Todos los problemas de la clase P (con dos excepciones que mencionaremos a continua-
ción) son polinómicamente equivalentes entre sí. Una función de reducción genérica
A ≤p B entre cualquier par de problemas A y B de la clase P se construiría de la forma
siguiente.
Primero, elegimos dos entradas del problema B, una con solución SÍ (ys ∈ IB ,B(ys ) = SÍ)
y la otra con solución NO (yn ∈ IB ,B(yn ) = NO). Qué entradas elijamos es indiferente,
sólo nos preocupa cuál es su solución. Entonces, la función de reducción f (x) se definiría
como:
y Cuando A(x) = SÍ
s
f (x) =
yn Cuando A(x) = NO
Para poder definir esta función f necesitamos que el problema B tenga alguna entrada
con solución SÍ y alguna entrada con solución NO. Precisamente, los dos problemas de P
donde no se puede establecer esta reducción son dos problemas definidos en el ejemplo
6: ProbSI, el problema con solución SÍ para todas las entradas y ProbNO, el problema con
solución NO para todas las entradas.
CC-BY-NC-ND • PID_00267022 36 Complejidad computacional
Ejercicios
30. Recordad el problema AJEDREZ definido en el ejemplo 25. ¿Es posible definir una re-
ducción AJEDREZ ≤p PAR? ¿Y PAR ≤p AJEDREZ?
31. En el ejercicio 27 hemos visto cómo hay que hacer la reducción polinómica SUMA_SUB ≤p
PARTICION. ¿Qué información nos aporta sobre la complejidad de estos problemas?
Soluciones
30. La reducción AJEDREZ ≤p PAR es imposible. Como PAR ∈ P, las propiedades de las
reducciones nos llevarían a afirmar que AJEDREZ ∈ P. Pero hemos visto previamente que
AJEDREZ no se puede resolver en tiempo polinómico y, por lo tanto, no es posible hacer la
reducción.
En cambio, la reducción contraria PAR ≤p AJEDREZ es factible según las propiedades de
las reducciones (PAR ∈ P, AJEDREZ ∈ ). La reducción f (x) se podría hacer de la forma
siguiente: si x es par, retorna un tablero de ajedrez donde el rey negro está rodeado de 9
reinas blancas (jaque mate en un movimiento); si x es impar, entonces retorna un tablero de
ajedrez donde sólo queda el rey blanco y el rey negro (es imposible ganar la partida).
31. Sabemos que PARTICION ∈ NP y, por lo tanto, podemos afirmar que SUMA_SUB ∈ NP
(dato que también podemos obtener definiendo el algoritmo verificador para SUMA_SUB).
Por otro lado, si consiguiéramos demostrar que SUMA_SUB ∈ / P, entonces sabríamos que
PARTICION ∈ / P. Pero de momento no se ha conseguido averiguar si SUMA_SUB pertenece
a P.
32. Cierto, ya que para cualquier problema Prob tenemos Prob ≤p Prob utilizando como
función de reducción la función identidad f (x) = x.
3.3. Completitud
Definición 25
.
Lectura
Teorema 26 complementaria
Ejemplo 41
Los problemas PARTICION y SUMA_SUB también son problemas NP-Completos (no ve-
remos la demostración).
Propiedad 27
Demostración: Sean A y B dos problemas C-Completos. Sabemos que todos los problemas
de la clase C se tienen que reducir polinómicamente tanto a A como a B. Además, al ser
A y B completos, ambos problemas pertenecen a C (A,B ∈ C). Esto significa que existen
las reducciones A ≤p B (ya que A ∈ C y B es C-Completo) y B ≤p A (ya que B ∈ C y
A es C-Completo). Como existen A ≤p B y B ≤p A, hemos demostrado que A y B son
polinómicamente equivalentes.
Fijaos que este razonamiento no permitiría demostrar que todos los problemas C-Difíciles
son polinómicamente equivalentes entre sí (propiedad totalmente falsa), ya que no podría-
mos asegurar que A,B ∈ C.
Propiedad 28
Esta propiedad nos ofrece una forma sencilla de demostrar que un problema
es difícil respecto a una clase: en lugar de tener que demostrar que todos los
problemas de la clase se pueden reducir a él, es suficiente construir una sola
reducción a partir de un problema difícil previamente conocido.
Ejemplo 42
A partir del teorema de Cook se puede demostrar que el problema 3SAT es NP-Difícil
si definimos una reducción SAT ≤p 3SAT. En SAT las cláusulas pueden tener cualquier
número de literales, mientras que 3SAT es una versión restringida del problema donde
todas las cláusulas tienen exactamente tres literales. Por lo tanto, cada cláusula de SAT
se tiene que transformar en un conjunto equivalente de cláusulas de tres literales. Parece
lógico que el procedimiento de traducción distinga cuatro casos de cláusulas de SAT: las
de un literal, las de dos literales, las de tres literales y las de cuatro o más literales.
Utilizamos las letras a,b,ai ,... para indicar los literales de las cláusulas SAT. Al hacer la
traducción a 3SAT tendremos que introducir nuevas variables en la fórmula, que deno-
minaremos mediante las letras α,β,αi ,...
La fórmula 3SAT resultante sería la conjunción de las traducciones de todas las cláusulas
SAT. Una vez propuesta la función f de reducción SAT ≤p 3SAT, nos hace falta compro-
bar que es una reducción correcta. Los dos pasos para hacerlo son (1) demostrar que f se
puede calcular en tiempo polinómico y (2) demostrar que SAT(x) = 3SAT(f (x)).
• Caso SAT(x) = SÍ: Algún literal ai tiene que evaluar a 1. Si fijamos todas las variables αi
a 0 excepto la que aparezca sin negar en la misma cláusula que ai podremos satisfacer
todas las cláusulas de f (x) y, por lo tanto, 3SAT(f (x)) = SÍ.
• Caso SAT(x) = NO: No hay ningún literal ai que se satisfaga y, por lo tanto, f (x) sólo
podría satisfacerse usando los literales αi . Tenemos suficiente con ver que siempre
CC-BY-NC-ND • PID_00267022 39 Complejidad computacional
queda alguna cláusula en 3SAT sin satisfacer. El razonamiento sería el siguiente: para
satisfacer la primera cláusula, α1 tiene que ser 1 ya que los literales ai son todos
0; entonces, para satisfacer la segunda cláusula, α2 tiene que ser 1; seguiendo así,
llegamos a la última cláusula teniendo que αk–3 tiene que ser 1 y, por lo tanto, no se
satisface la última cláusula. Así pues, hemos demostrado que 3SAT(f (x)) = NO.
En definitiva, hemos construido la reducción SAT ≤p 3SAT. Como sabemos que SAT es
NP-Difícil, podemos concluir que 3SAT es NP-Difícil.
Se podría ir más allá y demostrar que 3SAT es NP-Completo además de NP-Difícil. Para
demostrarlo sólo nos faltaría ver que el problema 3SAT pertenece a NP, es decir, que se
puede verificar en tiempo polinómico (repasad el ejercicio de autoevaluación 4).
Corolario 29
• Como tanto Prob como f se pueden calcular en tiempo polinómico, tenemos que A(x) =
Prob(f (x)) se puede calcular en tiempo polinómico y, por lo tanto, A ∈ P.
Este último corolario nos aporta un posible método para decidir la cuestión
?
P = NP: sólo necesitaríamos demostrar la pertenencia de un problema NP-
Completo en la clase P (o su no pertenencia) para concluir que P = NP (res-
pectivamente, P 6= NP). Es decir, si encontráramos un algoritmo que resolviera
un problema NP-Completo en tiempo polinómico o bién demostráramos que
no hay ninguno, habríamos resuelto uno de los problemas abiertos más im-
portantes del campo de la Informática Teórica.
Ejercicios
33. Según hemos definido las reducciones polinómicas, ¿qué problemas de la clase P son
P-Completos? ¿Y qué problemas de la clase NP son P-Completos?
34. ¿Una reducción PAR ≤p SAT nos permite demostrar que P = NP? ¿Y una reducción
SAT ≤p PAR?
35. Todo problema NP-Difícil tiene que ser NP-Completo. ¿Cierto o falso?
CC-BY-NC-ND • PID_00267022 40 Complejidad computacional
Soluciones
32. Tenemos que demostrar que existen dos reducciones polinómicas A ≤p C y C ≤p A. Para
hacerlo, nos aprovecharemos de la propiedad transitiva de las reducciones:
33. Todos los problemas de la clase P son P-Completos, excepto dos problemas: ProbSI, el que
tiene solución SÍ para todas las entradas y ProbNO, el que tiene solución NO para todas las
entradas. La demostración es la misma que hemos utilizado para ver que todos los problemas
de P (excepto estos dos) son polinómicamente equivalentes.
Respecto a la clase NP, es una pregunta con trampa: sólo los problemas de P pueden ser
P-Completos.
34. Sabemos que PAR ∈ P y SAT ∈ NP-Completo. Una reducción PAR ≤p SAT no nos aporta
más información sobre la complejidad de PAR y SAT. En cambio, una reducción SAT ≤p PAR
nos indicaría que SAT ∈ P y como SAT es NP-Completo podríamos concluir que P = NP.
35. Falso. La definición nos garantiza justamente lo contrario: que todo problema NP-Completo
es NP-Difícil.
CC-BY-NC-ND • PID_00267022 41 Complejidad computacional
Ejercicios de autoevaluación
2. Enunciad los problemas de optimización CPP, LCS y MCP (ejemplos 9, 10 y 11) como
problemas de decisión.
5. Dados dos problemas A y B, justificad si son ciertas o falsas las afirmaciones siguientes:
a) Si A ≤p B y B ∈ P, entonces A ∈ P.
b) Si A ≤p B y A ∈ P, entonces B ∈ P.
c) Calculad, en función del número de bits necesarios para representar N, la complejidad del
algoritmo propuesto. ¿Podemos afirmar que SUMA_N ∈ NP?
a)
b)
c)
CC-BY-NC-ND • PID_00267022 43 Complejidad computacional
d)
e)
d) Indicad qué conclusiones se pueden extraer de los apartados anteriores sobre la compleji-
dad del problema MPSCHED.
CC-BY-NC-ND • PID_00267022 44 Complejidad computacional
Solucionario
2. CPP: “Dado un conjunto de puntos en un espacio bidimensional, donde cada punto está
definido por unas coordenadas (x,y), y un número real d, decidir si hay algún par de puntos
que estén a distancia d o inferior.”
LCS: “Dadas dos cadenas de caracteres a y b y un entero k, decidir si la subcadena común
más larga entre a y b tiene k caracteres o más.”
MSP: “Dado un grafo ponderado y conexo (G,w) y un número real k, decidir si el árbol
generador minimal tiene peso k o menos.”
A partir del conjunto de entrada y el testigo, es posible validar que todos los elementos
de C′ estaban en el conjunto original C y que la suma de todos los elementos de C′ es
igual a 0. Todo esto se puede comprobar en tiempo polinómico.
4. Para demostrar que 3SAT ∈ NP tenemos que justificar que 3SAT se puede verificar en tiem-
po polinómico. En el ejemplo 29, ya hemos visto que hay un procedimiento para verificar
SAT en tiempo polinómico. Dado que 3SAT es un caso particular de SAT, el procedimiento
del ejemplo 29 también nos permite verificar 3SAT en tiempo polinómico.
i) Falsa. Aunque un problema S(B) sea NP-Difícil, esto no significa que los problemas B que
lo incluyen (S(B)• ⊆ B• ) sean NP-Difíciles. Por ejemplo, podríamos escoger B = ProbSI,
que sabemos que no es NP-Difícil (los problemas que tienen alguna entrada con solución
NO no se pueden reducir a este problema).
6. a) El problema
P de decisión asociado sería, SUMA_N: “Dado un natural N y un natural k,
decidir si Ni=1 i = k”.
b) En el algoritmo propuesto tenemos que hacer N –1 sumas por lo cual tendrá una compleji-
dad O(N), en función de N. Aunque la complejidad que hemos calculado es polinómica,
no podemos afirmar que SUMA_N ∈ P dado que no hemos tenido en cuenta el tamaño
de la entrada del algoritmo.
PN N(N+1)
Por suerte, la fórmula de Euler i=1 i = 2
se puede utilizar como función verificado-
ra, v : N × N → {SÍ,NO} definida por, si SUMA_N = k entonces v(N,k) = SÍ si N(N+1)
2
=ky
v(N,k) = NO, en otro caso. Esta función verificadora tiene una complejidad polinómica
y, por lo tanto, podemos concluir que SUMA_N ∈ NP.
d) Para poder afirmar que SUMA_N ∈ / P tendríamos que estar seguros de que no hay ningún
algoritmo de complejidad polinómica para calcular la suma de los N primeros núme-
ros naturales. Pero en el apartado anterior hemos visto que la fórmula de Euler resuel-
ve el problema con una complejidad polinómica. Por lo tanto, podemos afirmar que
SUMA_N ∈ P.
Observad que la fórmula de Euler sirve al mismo tiempo para demostrar que SUMA_N ∈
P y también como función verificadora (revisad el ejercicio 18).
Fijémonos que en este problema la entrada no es un valor del que tenemos que medir
su longitud en representación binaria, sino un conjunto de N elementos y, por lo tanto,
el tamaño de la entrada es N (el número de elementos del conjunto). Para poner un
ejemplo de esta diferencia, no es lo mismo un problema donde la entrada es un conjunto
CC-BY-NC-ND • PID_00267022 46 Complejidad computacional
de 75000 números que otro problema donde la entrada es el valor “75000”: en el primer
caso, el tamaño de la entrada es 75000, mientras que en el segundo caso el tamaño es
⌊log2 75000⌋ + 1 = 17.
d) Factible, pero en este diagrama se supone que hay problemas que están al mismo tiempo
en P y en NP-C. Por la definición de NP-C, entonces estamos asumiendo que P = NP = NP-
C.
Esta función se puede calcular en tiempo polinómico: sólo es necesario hacer un recorri-
do del multiconjunto, cambiando el signo a los valores negativos.
Nos queda demostrar que PARTICION(C) = PARTICION_NAT(g(C)), tanto para los casos
donde PARTICION(C) = SÍ como cuando PARTICION(C) = NO. Procedemos a hacerlo a
continuación:
Supongamos que hay una partición para g(C) en dos multiconjuntos C′1 y C′2 con la
misma suma total. A partir de aquí, construiremos una partición de C en C1 y C2 que
también tiene la misma suma total. La partición se construye de forma equivalente
al apartado anterior: para cada x ∈ C, si abs(x) estaba en C′1 , entonces lo añadimos a
C1 si x ≥ 0 y a C2 si x < 0; similarmente, si abs(x) estaba en C′2 , entonces lo añadimos
a C2 si x ≥ 0 y a C1 si x < 0.
CC-BY-NC-ND • PID_00267022 47 Complejidad computacional
Esta partición C1 y C2 preserva la suma total de cada parte, por el mismo razonamien-
to utilizado previamente:
Psumar –xP a una parte o sumar +x a la otra
Pson equivalentes.
P
Esto quiere decir que si x∈C′ x = x∈C′ x, también se cumplirá x∈C1 x = x∈C2 x.
1 2
10. a) Empezamos proponiendo un testigo para MPSCHED: una partición del conjunto A
en m conjuntos disjuntos.
Si hay n tareas y m procesadores, para este cálculo tendremos que hacer n – m sumas y
m comparaciones. Esto significa que la función de verificación es calculable en tiempo
polinómico.
Si la solución de MPSCHED es SÍ, habrá algún testigo que nos permita verificar esta so-
lución (por la propia definición del problema, que nos pide que exista esta partición).
Claramente, si la solución para una entrada es NO, ningún testigo nos permitirá verifi-
carla.
Concretamente, la propuesta de función de reducción f (C) es: hay una tarea para cada
número x de C, conP duración d igual a x y D es la mitad de la suma total de los valores de
C, es decir, D = ( x∈C x)/2. Esta función de reducción se puede calcular en tiempo poli-
nómico: sólo es necesario hacer un recorrido de C, calcular la suma total de los valores y
hacer una división por 2.
d) A partir del apartado a, podemos decir que MPSCHED pertenece a NP. A partir del apar-
tado b, podemos decir que MPSCHED es NP-Difícil. Combinando ambas informaciones,
podemos decir que MPSCHED es NP-Completo.
CC-BY-NC-ND • PID_00267022 49 Complejidad computacional
Bibliografía
Cook, S. (2003). The Importance of the P versus NP Question. [s.l.]: Journal of the ACM (vol. 1,
núm. 50, págs. 27-29)
Garey, M. R.; Johnson, D. S. (1979). Computers and Intractability. A Guide to the Theory of
NP-Completeness. Nueva York: Freeman and Co.