Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capítulo 9
Introducción a la Complejidad
Computacional
Hasta ahora nos hemos interesado en la algoritmia, que se ocupa del diseño y análisis
sistemático de algoritmos específicos para resolver algún problema dado. Sin embargo,
ningún curso sobre algoritmia estaría completo sin una introducción a la complejidad
computacional. Este campo, paralelo al de la algoritmia, considera globalmente todos los
algoritmos capaces de resolver un problema dado. Esto incluye también a los algoritmos
que aún no han sido inventados.
Consideremos como ejemplo introductorio el juego de las veinte preguntas. Una perso-
na elige un entero positivo no mayor que un millón, que la otra persona tiene que adivinar.
Se le permite a la persona realizar 20 preguntas que se puedan contestar con sí o con no. El
que eligió el número debe ser capaz de decidir sin ambigüedad si debe responder afirmati-
va o negativamente a cada pregunta. Lo más adecuado es usar un enfoque DyC para
Era tarea de la algoritmia encontrar este algoritmo, que muestre que 20 preguntas son
suficientes para resolver el problema. Pero es incumbencia de la complejidad decidir si 20
preguntas son necesarias.
9.1 Objetivos
El estudio de la eficiencia de los algoritmos no puede ser atacado por el argumento
“las computadoras del futuro serán increíblemente rápidas y por lo tanto no interesará
que el algoritmo sea eficiente”. Hay ejemplos que refutan esta afirmación, como el del
número de Fibonacci, o el hecho de que resolver el problema del viajante para 100 ciuda-
des llevaría 100 millones de años. Para resolver estos problemas se necesita una mejora en
los algoritmos; pero no una pequeña mejora, sino una mejora en órdenes de magnitud.
En general, los distintos grados de tratabilidad son muy subjetivos (varían mucho de
acuerdo al modelo computacional, los recursos disponibles, las variantes de las estructuras
de datos, etc.). Por lo tanto, un objetivo primario del estudio de la complejidad es definir
cuáles problemas son tratables, y cuáles no. Recién después de esto se pueden considerar
distintos grados de tratabilidad o intratabilidad.
Por ejemplo, se puede afirmar que la mayoría de los problemas vistos en este curso son
tratables, o sea que tienen solución para instancias grandes, y una mejora algorítmica o en
el hardware produce una gran ampliación en el conjunto de instancias que se pueden
resolver.
En cambio, hay problemas que no son tratables. Por ejemplo, el problema de las torres
de Hanoi, o el problema del Viajante, que en la práctica sólo se resuelven para instancias
pequeñas. Otro problema intratable es el denominado Monkey Puzzle, una especie
particular de rompecabezas (Figura 9.1). Si se tiene un tablero de n × n, no se conoce algo-
ritmo mejor que probar todas las combinaciones posibles para resolverlo. Esto es Ω(n!).
Para n = 5, generando un millón de configuraciones por segundo, se tardaría 490000
millones de años en resolverlo.
Esta evidencia empírica ha permitido acordar que si un problema admite una solución
polinomial entonces estamos ante un problema tratable; en caso contrario se lo considera
intratable. Para tener una mejor idea de la diferencia entre tratable e intratable:
Problemas tratables:
Problemas intratables:
Función \ n 10 50 100 300 1000
2n 1024 16 dígitos 31 dígitos 91 dígitos 302 dígitos
n! 3600000 65 dígitos 161 dígitos 623 dígitos inimaginable
(7 dígitos)
nn 11 dígitos 85 dígitos 201 dígitos 744 dígitos inimaginable
Esto significa que si suponemos que un algoritmo ejecuta 1000 instrucciones por
microsegundo, el algoritmo tarda:
Problemas tratables:
Función \ n 10 50 100 300 1000
1/10000 1/2500 1/400 1/100 9/100
n2
segundo segundo segundo segundo segundo
n5 0,1 seg 3,2 seg 5,2 seg 2,8 hs 28,1 días
Problemas tratables:
Función \ n 10 50 100 300 1000
1/1000 400 billones
2n 1 segundo 35,7 años ——
segundo de siglos
3,3 billones
nn 2,8 hs —— —— ——
de años
Para comparación, se considera que el Big Bang ocurrió hace aproximadamente 15000
millones de años.
Los problemas de decisión son aquellos donde se busca una respuesta por sí o por no.
Se denominan así porque deciden si una instancia dada es una solución al problema. Los
algoritmos que resuelven problemas de decisión son reconocedores, o comprobadores de
parejas “Instancia, Solución”.
De esta forma, para propósitos teóricos, es más conveniente tratar con problemas de
decisión que con problemas de optimización. En teoría de complejidad, por lo tanto, se
trabaja con problemas de decisión, ya que como se dijo cualquier problema de optimiza-
ción puede ser reducido a un problema de decisión. Esto se hace para que el estudio de la
complejidad sea uniforme.
U
V
Z W
Y
X
9.4 Problemas P y NP
Al estudiar los problemas de decisión, se pueden encontrar varias clases:
La mayoría de los problemas que vimos hasta aquí en el curso pertenecen a la clase P:
¿Se encuentra el número n en este vector? ¿Existe un flujo de valor mayor que K en esta
red? ¿Existe un árbol de cubrimiento en este grafo tal que la suma de los pesos de los
arcos es menor que S? Para cada uno de estos problemas existe un algoritmo rápido (de
tiempo polinomial).
a) Asociado con cada palabra del lenguaje Q (es decir, con cada instancia I para la
cual la respuesta es “Sí”), existe un certificado C(I) tal que, cuando se ingresa el
par (I, C(I)) en el algoritmo, éste reconoce que I pertenece al lenguaje Q.
Para decirlo más brevemente, NP es la clase de los problemas de decisión para los
cuales es fácil comprobar la correctitud de una respuesta propuesta, con la ayuda de un
poco de información adicional. Es decir que no se está buscando la forma de encontrar
una solución, sino sólo de verificar que una solución propuesta es realmente correcta.
Parece natural suponer que NP es más grande que P. Es decir, uno podría suponer que
hay problemas cuyas soluciones pueden ser rápidamente comprobadas con la ayuda de
cierta información adicional, aún cuando esas soluciones no se puedan encontrar en
tiempo razonable. Sin embargo, no se ha producido (ni probado) ningún ejemplo de tal
problema. Por lo tanto, el problema de determinar si P = NP o P ≠ NP es una de las
preguntas abiertas más importantes hoy en día en esta área. ¿Es posible que para todos los
problemas en NP existan algoritmos deterministas que los resuelvan en tiempo polinomial
y que aún no hayan sido descubiertos? Esto parece improbable ya que mucha gente ha
trabajado sobre estos problemas. Por otro lado, el hecho de que P ≠ NP tampoco ha sido
probado.
Los problemas NP–Completos son los problemas más difíciles en la clase NP, y sus
implicaciones son numerosas. Supongamos que se pudiera probar que un cierto problema
de decisión es NP–Completo. Luego, se podrían dirigir todos los esfuerzos a encontrar un
algoritmo de tiempo polinomial sobre ese único problema. De hecho, si se tuviera éxito en
encontrar ese algoritmo, automáticamente tendríamos un algoritmo rápido para resolver
cualquier problema de NP. La palabra completitud significa que la solución de un
problema de decisión NP contiene, de alguna forma, la solución a todos los problemas de
decisión de la clase NP.
• Por el contrario, si se pudiera probar que no existe ningún algoritmo rápido para
uno de los problemas NP–Completos, entonces no podría haber algoritmos rápidos
para ningún otro de estos problemas.