You are on page 1of 26

Monografa:

Matemticas NM

Ttulo: Algoritmos y Teora de la complejidad computacional

Resumen

Desde pequeo me ha fascinado el mundo de las matemticas. Recuerdo que cuando era chico
uno de los primeros libros que recib fue un libro interactivo de matemticas. Mi fascinacin por
la matemtica terica me ha llevado siempre ha seguir buscando nuevos temas y estudiarlos.
Siempre encuentro un tema ms fascinante que otro. As es como un da encontr una teora,
teora de la complejidad computacional. Empec a investigar, a ver cmo funciona, en qu se
centra y me di cuenta de que estaba fuera de mis lmites matemticos. Aun as nunca par de
fascinarme. Siempre le peda a mi hermano que me explicar qu era esto o lo otro. As que aqu
estoy, intentando compartir la fascinacin que tengo por esta materia a ustedes. Tal vez no pueda
ser capaz de explicar todo lo que quisiera, pero ms adelante, si tengo la oportunidad, sin dudarlo
un segundo lo har. Mi trabajo se centrar en esto, en expresar la belleza de esta teora, en ver
cmo funcionan los algoritmos, qu es un algoritmo, crear un algoritmo como ejemplo. Dar a
conocer cmo se ordenan problemas, desde el ms simple y cotidiano hasta uno imposible de
resolver en la prctica.

INDICE
INTRODUCCIN

COMPLEJIDAD COMPUTACIONAL

ALGORITMOS

GRADOS DE COMPLEJIDAD

EJEMPLOS

TORRES DE HANI
ALGORITMOS DE ORDENAMIENTO

9
13

RECURSOS

17

TIEMPO
ESPACIO

17
20

PROBLEMAS

22

PROBLEMAS DEL TIPO P


PROBLEMAS DEL TIPO NP
PROBLEMAS DEL TIPO NP-COMPLETO

22
22
23

CONCLUSIN

23

REFERENCIAS

24

Introduccin
Cuenta la historia que en la India, especficamente en un templo en Benars, a orillas del ro
Ganges, se encontraba una cpula que sealaba el centro del mundo. All se encontraban 3
estacas de diamante. Una noche el rey hizo poner 64 discos en una de las estacas ordenados
con el mayor ms abajo y el menor arriba. Los monjes del templo al ver lo que aconteci,
intentaron mover los discos segn estas reglas: No se puede mover ms de un disco a la vez
y no se puede poner un disco de mayor radio sobre uno de menor. Otra teora dice que dios
deposit los mismos 64 discos sobre 3 estacas de diamante y se dice que el da que los
monjes logren mover los 64 discos, el mundo se acabar.
Esto fue slo un invento creado por el matemtico duard Lucas para publicitar el juego de
las torres de Hani. Segn sus clculos el nmero de movimientos para resolver este
problema es de 264 1 movimientos. No entraremos en la demostracin de porqu el
resultado es el dado, pero s podemos comprobar que efectivamente son aproximadamente
593 miles de millones de aos. Si se toma que se hace un movimiento por segundo,
ininterrumpidamente se puede realizar el siguiente clculo.
2641 seg .=

2641
2641
horas=
3600
3600243012

aos =

2641
miles de mill . de aos 593 miles de mill . de a os
36008640109
Estamos hablando de ms aos que la edad del universo. Lo que quera demostrar este
matemtico era lo imposible de resolver este problema en la prctica.
Comparando esto por ejemplo con un problema tan cotidiano como saber cul es el camino
ms corto de mi casa al hospital ms cercano, podemos darnos cuenta a simple vista que el
primer problema se ve mucho ms complejo de resolver que el segundo. Quin sera capaz
de calcular a mano 264? Con 220 ya tomara una cantidad de tiempo muy significativa. Para
acortar y optimizar el tiempo de calcular un problema como el anterior, se utilizan varios
recursos. Uno de ellos es el uso de algoritmos, principalmente de ordenamiento que sern
con los que trabajar en mi monografa. De esto se trata mi trabajo, de comparar problemas
ms difciles o fciles de resolver. La encargada de hacer este proceso es la complejidad
computacional.

Complejidad Computacional
La teora de la complejidad computacional 12estudia, tericamente, la complejidad en la
resolucin de un problema computacional. Para resolver un problema computacional se
utilizan algoritmos, que bsicamente son instrucciones a seguir para resolver el problema
dado. Los algoritmos se pueden ordenar segn su complejidad y los dos grandes parmetros
que se utilizan para medir el grado de complejidad de un problema computacional son la
memoria o espacio que se necesita para la determinacin de un problema en general y el
tiempo que demanda en determinar una solucin. La complejidad computacional se ocupa
entonces, entre otras cosas, de la limitacin prctica que puede alcanzar una computadora a
la hora de resolver un problema mediante algoritmos.
Esta teora se complementa con la teora de la computabilidad, que se basa principalmente
en expresar problemas como algoritmos. Cmo podemos ver, al fin y al cabo ambas teora
utilizan algoritmos. Lo que se busca es encontrar o calcular los recursos necesarios para
encontrar una solucin al problema en general, lo que se mide generalmente por el tamao
de las iteraciones o repeticiones necesarias para todas las instancias posibles de este mismo
problema.
A la hora de analizar cualquier problema, se debe tener en cuenta los siguientes
factores3:
1. Descripcin general del problema.
Es el objetivo del problema (Qu se quiere hacer?, qu se quiere lograr?)
2. Lista de parmetros y caractersticas de la solucin
Esto incluye: qu parmetros intervienen en el problema? cules son las reglas
1http://es.wikipedia.org/wiki/Teor
%C3%ADa_de_la_complejidad_computacional#Problemas.2C_algoritmos_y_complejidad
2 http://cala.unex.es/cala/epistemowikia/index.php?title=L%C3%ADmites_de_la_computaci
%C3%B3n
3 http://www.gridmorelos.uaem.mx/~mcruz/cursos/optimizacion/problemas.pdf
5

definidas para resolver el problema, es decir, las reglas a seguir? qu significa


resolver el problema?
3. Especificacin de un ejemplo (Instancia)

Algoritmos
Dentro de la complejidad computacional uno de los temas centrales es la utilizacin de
algoritmos para poder identificar y resolver problemas. Gracias a los algoritmos podemos
dividir los problemas por su grado de dificultad. Pero primero qu es un algoritmo? Un
algoritmo4 se define como un nmero de instrucciones a seguir para poder resolver un
clculo o un problema. Estas instrucciones estn ordenadas, definidas y son finitas.
Ahora hay que diferenciar entre el problema en general y una instancia o ejemplo del
problema. El algoritmo permite resolver el problema en general y lo podemos ocupar para
cualquier instancia que se nos presente.
Nos ocuparemos de un tipo especial de algoritmo denominado algoritmo de
ordenamiento. Existen dos tipos de algoritmos de ordenamiento, los iterativos y los
recursivos.
Los iterativos, se basan en ciclos para ordenar un conjunto de elementos. Estos son menos
complejos que los recursivos, que se llaman a s mismos. Esto quiere decir que el
algoritmo es utilizado por s mismo de manera inteligente para resolver un problema. Una
explicacin un poco coloquial para entender cmo funciona un algoritmo recursivo sera el
algoritmo llama a un amigo. Yo llamo a un amigo para preguntarle algo, pero l no sabe.
Entonces l llama a un amigo para preguntarle mientras yo espero la llamada de mi
amigo. Ese amigo tampoco sabe, as que llama a un amigo mientras el resto espera. Esto
ocurre as hasta que alguien llama a un amigo que s sabe, y despus empiezan en cadena
a responderse hasta que finalmente me llega la respuesta a mi pregunta inicial.

4 http://es.wikipedia.org/wiki/Algoritmo#An.C3.A1lisis_de_algoritmos
6

Grados de complejidad
Para dar cuenta de la complejidad de un algoritmo, se utilizan funciones bsicas. Esto
quiere decir que comparamos el algoritmo con alguna funcin bsica que se comporte de la
misma manera al tender a infinito. Se utiliza la notacin O(g(x)) (se lee: orden de g de x)
para indicar que el algoritmo se comporta igual que g(x).
Por orden de complejidad se tienen en primer lugar el orden O(1), que se utiliza para
funciones que se comportan como constantes; O(n) de orden lineal; O(nc), de orden
potencial; O(log n), de orden logartmico, O (cn) con n > 1, de orden exponencial. Existen
adems muchos otros rdenes que omitimos de esta lista. Slo sealamos los ms
conocidos.
Para el algoritmo Bubble Sort, que explicaremos ms adelante, se puede demostrar que se

trata de un algoritmo de complejidad O

puede comprobar que O

n n
2

n2n
2

) , y gracias a la cota ajustada asinttica se

= O (n2), es decir, es de orden cuadrtico. Veamos:

En el grfico se pueden ver expresadas las funciones f ( x )=

x 2x
2

f(x) = x2. Ambas funciones presentan un comportamiento semejante al tender


a infinito, lo cual podemos expresar de la siguiente manera:
lim

n 2n
=lim n2 =
2
n

Esta expresin da como resultado que O

n n
2

= O (n2).

Ejemplos
Torres de Hani

Ahora si aplicamos todo lo visto anteriormente a un problema concreto, como el de las


torres de Hani5 tenemos lo siguiente:
1. Se quiere mover un set de discos de distintos radios ordenados en orden decreciente
desde una estaca (A) a otra (C). Los discos estarn enumerados desde el 1, siendo el
ms pequeo, hasta n, siendo este el ms grande. Lo que se busca es encontrar la
solucin en el mnimo de movimientos posibles.

Fig. 16. Muestra de un set de 8 discos (n=8) con 3 estacas con A como origen, B como
auxiliar y C como destino.
2. El propsito del problema es mover todos los discos desde la estaca origen (A) hasta
la estaca destino (C) siendo la estaca auxiliar (B) un intermedio en donde es posible
depositar un disco deseado. Las reglas son simples, slo se puede mover un disco a
la vez, no se puede depositar un disco de mayor radio sobre uno de menor y slo es
posible mover el disco que se encuentre ms arriba de cada estaca.
El algoritmo es el siguiente:
5 http://es.wikipedia.org/wiki/Torres_de_Han%C3%B3i
6 http://www.rodoval.com/heureka/hanoi/hanoi1.png
9

Algoritmo 1
1. Si n es par,
entonces mover disco 1 cclicamente de A a B, de B a C o de C a A
Si n es impar,
entonces mover disco 1 cclicamente de A a C, de C a B o de B a A
2. Si todos los discos estn en destino (C) fin
Si no,
mover un disco distinto al disco 1.
Veamos una instancia para que podamos entender el problema con ms facilidad.
Instancia 1:
n=3

Como en este caso n es impar, entonces el


paso 1 nos indica que el disco 1 har un
movimiento cclico de A hacia B, hacia C y
de vuelta hacia A.
Ya que no todos los discos estn en destino
(C), mover un disco distinto al 1.
movemos 2, el cual slo se puede mover
hacia B.

10

Ciclicamente 1 se mueve de C a B.

1 no se desplaza, nico movimiento posible es


3 a (C)

Se mueve 1 cclicamente por regla.

2 a (C) es el nico movimiento posible

Finalmente se mueve 1 de (A) hacia (C)

Todos los discos en (C)? S, entonces fin.

Habiendo estudiado vectores y matrices en el colegio, siempre quise ver qu otras


aplicaciones posibles tenan las matrices adems de ser ocupadas para expresar sistemas de
11

ecuaciones lineales o diferenciales. Ah es donde se me ocurri por qu no ocupar matrices


para describir paso a paso los movimientos necesarios a realizar en el juego de las torres de
Hani. Descubr que ocupando matrices se logra una expresin ms prctica y simplificada
de cmo resolver una instancia del problema torres de Hani. Estas matrices que veremos a
continuacin presentan lo mismo que se ve en las imgenes que vimos anteriormente.
Utilizando el mismo ejemplo n = 3, la notacin en matrices sera la siguiente:

[ ][ ][ ][ ][ ][ ][ ][

1 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 1
2 0 0 2 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 2 0 0 2
3 0 0
3 0 1
3 2 1
3 2 0
0 2 3
1 2 3
1 0 3
0 0 3

Tomemos ahora una instancia par, como n = 2, la notacin en matrices sera:

] [

] [

] [

1 0 0 0 0 0 0 0 0 0 0 1
2 0 0
2 1 0
0 1 2
0 0 2

12

Dos Algoritmos a modo de ejemplo

El algoritmo que veremos a continuacin es de los ms conocidos y por su grado de


complejidad, no tan difcil de explicar. Se denomina de ordenamiento por burbuja o Bubble
Sort7.
El ordenamiento por burbuja se basa principalmente en el ordenamiento de elementos por
comparacin. Esto quiere decir que un elemento determinado es comparado con todos los
dems elementos del conjunto y ordenado dependiendo de los parmetros impuestos, por
ejemplo ordenados creciente o decrecientemente. La complejidad de este algoritmo viene
dado por O(n2). Una forma de ver porqu es as, es simplemente viendo cmo se comporta
el problema. Un conjunto n de trminos en Bubble Sort se compara consigo mismo
(n 1)
2

veces. Lo que nos da la expresin

n(n 1) n 2n
=
, que como vimos
2
2

anteriormente se comporta de la misma forma con n2 cuando ambas tienden a infinito.


El algoritmo para resolver cualquier instancia de Bubble Sort viene dado por:
Ordenar de manera creciente el conjunto {a1, a2, a3,, an}
1. i tomar los valores desde 1 hasta n 1
j tomar los valores desde 1 hasta n - i
2. Si aj> aj + 1, entonces intercambiarlos
Ejemplo
Veamos un ejemplo para a = {42, 31, -20, 17}
La lista a tiene 4 elementos, as que n = 4.
El ndice i tomar los valores de 1 hasta 3, lo cual anotaremos
i = 1 hasta 3
7 http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja
13

El ndice j tomar los valores de 1 hasta 4 i, es decir


j = 1 hasta 4 i
Para el primer bucle de trminos:
i = 1, y j = 1 hasta 3, entonces tenemos, para j = 1
a1 = 42 y a2 = 31,
comparamos: 42 > 31?
S, entonces intercambiamos y la lista queda {31, 42, -20, 17}
Ahora tomamos j = 2 y repetimos el procedimiento anterior
a2 = 42 y a3 = -20
42 > -20? s, entonces intercambiamos y la lista queda {31, -20, 42, 17}
Ahora j = 3
a3 = 42 y a4 = 17.
comparamos, 42 > 17? s, entonces intercambiamos y la lista queda
{31, -20, 17, 42}
Una vez que hemos recorrido todos los valores posibles para j, tenemos que i ahora toma el
valor de 2. Para el segundo bucle tenemos que:
i = 2, j de 1 hasta 2
j=1
a1 = 31 y a2 = -20, comparamos, 31> -20? s, entonces intercambiamos y la
lista queda
{-20, 31, 17, 42}
j=2

14

a2 = 31 y a3 = 17, comparamos 31 > 17? s, entonces intercambiamos y la


lista queda
{-20, 17, 31, 42}
La lista ya ordenada {-20, 17, 31, 42}
Podemos ver que el conjunto de nmeros ya est ordenado de forma creciente, pero como
el algoritmo no toma en cuenta esto, va a seguir iterando hasta llegar a i = 3, j = 3, que
comparara a3 = 31 con a4 = 42 y se pregunta 31 > 42? no, entonces no se intercambia. Para
efectos prcticos dejar el problema hasta ac, el cual ya est resuelto, pero fcilmente se
puede seguir iterando hasta finalizar el problema.

A continuacin se presenta un ejemplo de un algoritmo recursivo de complejidad O (n), que


permite calcular la potencia de un nmero.

El algoritmo elevar (x, n)


elevar (x, n) // { con x distinto de 0 y n } con x = base y n = exponente
1. Si n = 0 devuelve 1
Si no devolver x*elevar (x, n-1)

Instancia nmero 1:
Calcular 24: elevar (2,4)
2*elevar (2,3), que es equivalente a decir elevar (2,4)
2*elevar (2,2), que es equivalente a decir elevar (2,3)
2*elevar (2,1), que es equivalente a decir elevar (2,2)
2*elevar (2,0), que es equivalente a decir elevar (2,1)
15

1 que es equivalente a decir elevar (2,0)


As como en el algoritmo llamar a un amigo, el algoritmo elevar (x, n) se llama a s
mismo hasta encontrar una salida que satisfaga la regla, los pasos que se hicieron o
llamadas quedan guardados en la memoria para que una vez se llegue a la salida, se vaya
llamando de vuelta a s mismo. Para elevar (2, 4) se tiene que:
elevar (2, 0) = 1 2*elevar (2, 0) = 2 2*elevar (2, 1) = 4
2*elevar (2, 2) = 8 2*elevar (2, 3) = elevar (2, 4) = 16

Instancia nmero 2:
elevar (3,6)

3*elevar (3,5)
3*elevar (3,4)
3*elevar (3,3)
3*elevar (3,2)
3*elevar (3,1)
3*elevar (3,0)
1
elevar (3,0) = 1 3*elevar (3,0) = 33*elevar (3,1) = 93*elevar
(3,2) = 273*elevar (3,3) = 813*elevar (3,4) = 2433*elevar
(3,5)= elevar (3,6) = 729

Podemos ver que ambas instancias ocupan el mismo algoritmo, o sea que su complejidad
es similar, pero el espacio o memoria que ocupan ambos es distintos. Ya que la instancia 2
se calcul en ms pasos o iteraciones, ocupa un mayor espacio que la instancia 1.

Recursos
Tiempo

16

Uno de los recursos ms importantes para la clasificacin de un problema como


inherentemente difcil o uno abordable es su tiempo de ejecucin o resolucin. Dentro del
tiempo o espacio temporal se puede encontrar dos tipos de tiempo que nos ayudarn a
definir la complejidad del problema. El primero es el tiempo polinmico. Es el ms
utilizado y el ms fcil de emplear y estudiar. Se dice que un algoritmo se puede ejecutar en
tiempo polinmico cuando la solucin al problema en tiempo es menor a un valor de
tiempo calculado, el que tiene directa incidencia y es calculado a partir del nmero de
variables del polinomio. As podemos tener problemas que se resuelven en distintos
tiempos polinmicos como los cbicos O(n3), cuadrtico O(n2) que coincide con el
algoritmo empleado en Bubble Sort o lineal O(n) que es el que ocupamos como ejemplo
23

para un algoritmo recursivo en elevar (x, n). Podemos ver que

n500 , 2 n2 +7 n31 , etc.

son todos tiempos polinmicos. Dicho esto podemos escribir el tiempo polinmico en
general de la siguiente manera:
k

x
DTIME( )
P= k N

Se denomina como el conjunto de problemas en tiempo O(f(n)), donde P son todos


problemas en tiempo polinmico y DTIME es el tiempo de cmputo o que se demora en
dar una respuesta.
Los problemas resolubles en tiempo polinmico se caracterizan en general por ser los
problemas ms sencillos de resolver y tratables en la prctica.

Un ejemplo para un problema resoluble en tiempo polinmico sera el siguiente:


f(x) = 4x4 + 2x3 5x2
Para una instancia de x = 4, tenemos que:
f(4) = 4*44 + 2*43 5*42 = 1024 + 128 80 = 1072

17

Ahora si tenemos otro ejemplo donde x = 502, tenemos que:


f(502) = 4*5024 + 2*5023 5*5022 = 254024064064 + 253012016 1260020 =
254275816060
Que sigue siendo un problema relativamente tratable, pero de un espacio mayor.
Para un instancia de x = 306918709274, tenemos que
f(306918709274) = 4*3069187092744 + 2*3069187092743 5*3069187092742 =
3,549387731886490720161798587937946 +
5,782292875338847825787169558644634 470995470512090668035380 =
1,0135526
Que para efectos prcticos es inefectivo en tiempo, pero sigue siendo inmensamente ms
eficiente que un tiempo exponencial, que ser lo que veremos a continuacin.
El tiempo exponencial8 o mejor dicho un problema en tiempo exponencial es cualquier
problema que no se puede expresar en tiempo polinomial y para el cual tampoco se puede
expresar por debajo de un exponencial 2n. El conjunto de problemas tratables o resolubles
en tiempo exponencial est dado por:
2
DTIME( nk )
EXPTIME= k N

Se denomina como el conjunto de problemas en tiempo O(2 p(n)) con p(n) definida como una
funcin polinomial sobre n. Donde EXPTIME son todos problemas en tiempo exponencial
y DTIME es el tiempo de cmputo o que se demora en dar una respuesta.

Un ejemplo para un problema en tiempo exponencial sera el siguiente:


n
f(n) = 2

Para una instancia de n = 5, tenemos que:

8 http://es.wikipedia.org/wiki/Tiempo_exponencial
18

5
f(5) = 2

= 2125 = 4,253529586511730793292182592897137

Podemos percatarnos al instante, que ya ocupando un nmero pequeo como 5, el resultado


es tremendo, lo cual lo hace muy ineficiente en trminos de tiempo, pero a la vez ms
eficiente en trminos de memoria, que ser lo que veremos ms adelante.
Ahora, para una instancia un poco mayor, como n = 20, tenemos que:
20
f(20) = 2

= 28000 = 1,73766203193809456599982445949442408

Haciendo una tabla comparativa entre tiempo polinomial y tiempo exponencial tomando en
cuenta un procesador de computador que en promedio realiza una instruccin en 1,5*10 -9
segundos, tenemos los siguientes resultados:
n=
n2

5
3,75-8 segundos

25
9,375-7segundos

n4

9,375-7segundos

2n

4,8-8segundos

5,853755
segundos
5,03316482
segundos

125
2,343755
segundos
3,662109381
segundos
2,0512812
miles de
millones de
aos

1000
1,5-3segundos
25 minutos
5,1674275 miles
de millones de
aos

Podemos ver que una mquina promedio se demorara un tiempo imposible en la prctica,
en la prctica, para resolver un problema en tiempo exponencial con nmeros que para un
tiempo polinomial se consideran pequeos, como 125 y 1000. Con esto probamos que en
teora, un tiempo polinomial es resoluble en un tiempo tratable o aceptable, mientras que
las computadoras hoy en da seran incapaces de calcular un problema en tiempo
exponencial con nmeros relativamente pequeos.

Espacio
Otro recurso para medir la complejidad de un problema es el espacio o memoria que ocupa
este. Cmo en el tiempo requerido no entra como parmetro el espacio ocupado por un
19

algoritmo para resolver problemas, ac no se toma el tiempo, o sea es ilimitado y se toma


en cuenta el espacio necesario para albergar el algoritmo. Al igual que en el tiempo, existen
dos tipos de espacios, los espacios polinomiales y exponenciales.
El espacio polinomial9 alberga los problemas de decisin, que son los problemas de
respuesta s o no, que se resuelven en un espacio de polinomios. La notacin de la
unin de problemas de decisin tratables en un espacio polinomial est dado por:
n
( k )
PSPACE= k N SPACE
Se denomina como el conjunto de problemas en espacio O(f(n)), donde PSPACE son todos
problemas en espacio polinmico y SPACE la memoria necesaria para albergar la
respuesta.
Tomando como ejemplos las funciones utilizadas en el recurso tiempo dos funciones en
tiempo polinomial sern de distinto espacio dependiendo de la n del problema. As para una
funcin f(n) = n4 + n3 una instancia n = 50294 va a ocupar un espacio significantemente
mayor que una instancia de n = 4.
Por otra parte, el espacio exponencial10 alberga todos los problemas de decisin que son
resolubles en un espacio de exponentes. La unin de todos los problemas solucionables en
un espacio exponencial viene dado por:

2n
DSPACE( )
EXPSPACE= k N

9 http://es.wikipedia.org/wiki/PSPACE
10 http://es.wikipedia.org/wiki/EXPSPACE
20

Se denomina como el conjunto de problemas en espacio O(2 p(n)), donde EXPSPACE son
todos problemas en espacio exponencial y DSPACE la memoria necesaria para albergar la
respuesta.
Ocurre exactamente lo mismo que en el espacio polinomial. Comparando dos instancias de
la funcin exponencial f(n) =

2n

como n = 2 y n = 620, se llegar a la misma

conclusin. Mientras ms grande sea n, mayor el espacio que se necesitar para albergar el
problema.

21

Problemas
Problemas del tipo P

En la complejidad computacional se diferencian tres clases de problemas segn su


complejidad y grado de resolucin. Los problemas resolubles en un tiempo aceptable y
tratable en la prctica son denominados problemas del tipo P 11 (por polinomial). Estos
tienen la caracterstica de ser problemas solubles en la realidad por una computadora. Por
ejemplo, todos los problemas en tiempo y espacio polinomial que explicamos anteriormente
son problemas de tipo P. Como vimos anteriormente con Bubble Sort, este algoritmo de
ordenamiento es del tipo P por su orden de complejidad O(n 2), ya que te da una respuesta
en tiempo polinmico.

Problemas del tipo NP


Los problemas del tipo NP12 son todos los problemas de los que no existe una solucin en
tiempo polinomial que las resuelva, aunque s se puede comprobar en tiempo polinmico.
Esto quiere decir que tal vez exista un algoritmo polinomial que la resuelva, pero no se ha
encontrado an, lo que es muy improbable. Dentro de los problemas del tipo NP se
encuentras todos los problemas P y los NP-completos, siendo estos ltimos los ms difciles
dentro de los NP. Un ejemplo de problema NP es el famoso problema del agente viajero que
busca encontrar la ruta ptima que pase por todos los puntos en un nodo de grafos, por
ejemplo ciudades. Para el colegio se necesita crear un horario cada ao, donde todas las
horas de clases coincidan con el horario del profesor, que no haya 2 clases al mismo tiempo
en donde se necesite al mismo profesor y que no se repita la misma asignatura ms de 3
horas, por ejemplo no tener todo el da slo matemticas. Es muy difcil resolver el
problema del horario, pero a la vez muy fcil comprobar si funciona o no. Si no te llega
ninguna queja, est todo bien, al contrario, si te llegan mltiples quejas, como ocurre todos
11 http://es.wikipedia.org/wiki/P_(clase_de_complejidad)
12 http://es.wikipedia.org/wiki/NP_(clase_de_complejidad)
22

los aos en mi colegio, hay algo que no est bien. De esto se tratan los problemas NP, de
problemas

difciles

de

resolver,

pero

fciles

de

comprobar.

Problemas del tipo NP-Completo

Los problemas NP-completo13 son los ms difciles dentro de los problemas NP. Segn el
Teorema de Cook, cualquier problema que est en NP puede ser reducido a un problema
NP-Completo. Los problemas NP-Completo son los ms lejanos de estar en P por su grado
de complejidad. Un ejemplo de problema NP-Completo es el de la suma de subconjuntos.
El enunciado dice as: Dado un conjunto S de enteros, existe un subconjunto no vaco
de S cuyos elementos sumen cero?14 El problema no es resolverlo, ya que fcilmente se
puede comprobar con alguna instancia de un conjunto S, el problema es que no se ha
podido encontrar una solucin ms ptima que 2n 1 subconjuntos posibles.

Conclusin

Resumiendo brevemente lo que hice en este trabajo, expliqu 3 ejemplos de algoritmos,


expliqu el procedimiento a seguir para resolver cada uno de ellos, me bas en la
complejidad computacional para dar un orden de complejidad a los distintos ejemplos que
observamos y describimos los 3 tipos de problemas que existen en complejidad
computacional. El potencial que tiene esta teora a futuro es impresionante, como mis
conocimientos y manejo no alcanzan a comprender todo este mundo, el cual me fascina
impresionantemente, me gustara poder agrandar mi conocimiento en el tema

13 http://es.wikipedia.org/wiki/NP-completo
14dem
23

Referencias
http://es.wikipedia.org/wiki/NP-completo
http://es.wikipedia.org/wiki/NP_(clase_de_complejidad)
http://es.wikipedia.org/wiki/P_(clase_de_complejidad)
http://es.wikipedia.org/wiki/EXPSPACE
http://es.wikipedia.org/wiki/PSPACE
http://es.wikipedia.org/wiki/Tiempo_exponencial
http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja
http://es.wikipedia.org/wiki/Torres_de_Han%C3%B3i
http://www.rodoval.com/heureka/hanoi/hanoi1.png
http://es.wikipedia.org/wiki/Algoritmo#An.C3.A1lisis_de_algoritmos
http://cala.unex.es/cala/epistemowikia/index.php?title=L%C3%ADmites_de_la_computaci%C3%B
http://www.gridmorelos.uaem.mx/~mcruz/cursos/optimizacion/problemas.pdf
http://es.wikipedia.org/wiki/Teor
%C3%ADa_de_la_complejidad_computacional#Problemas.2C_algoritmos_y_complejidad

24

25

26

You might also like