Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

16
Universidad San Sebastián Facultad de Ingeniería y Tecnología Escuela de Ingeniería Civil Informática Cátedra de Fundamentos de Ciencias de la Computación ANÁLISIS DE ALGORITMOS: COMPLEJIDAD Y CLASES DE PROBLEMAS. Profesora: Jacqueline Köhler Estudiantes: Oscar Bravo Yasser Isa Francisco Madrid

Transcript of Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

Page 1: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

Universidad San Sebastián

Facultad de Ingeniería y Tecnología

Escuela de Ingeniería Civil Informática

Cátedra de Fundamentos de Ciencias de la Computación

ANÁLISIS DE ALGORITMOS:

COMPLEJIDAD Y CLASES DE PROBLEMAS.

Profesora: Jacqueline Köhler

Estudiantes: Oscar Bravo

Yasser Isa

Francisco Madrid

Page 2: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

TABLA DE CONTENIDO Introducción ................................................................................... 3

Complejidad de Algoritmos ................................................................. 4

¿Por qué estudiar lacomplejidad de los algoritmos? ................................. 4

Notaciones para el Cálculo de la Complejidad ........................................ 5

Cota Superior (Notación O) ............................................................ 5

Cota Inferior (Notación Ω) ............................................................. 6

Cota Ajusta o de Orden Exacto (Notación Θ) ....................................... 6

Complejidad de Algoritmos Recursivos ................................................. 8

Clases de Problemas ........................................................................ 10

Clase de Problemas y Justificación del Problema ................................... 10

Problemas de Decisión ................................................................... 11

Problemas de Localización .............................................................. 11

Problemas de Optimización. ............................................................ 12

Clases de Problemas ...................................................................... 12

Clase P ................................................................................... 12

Clase NP ................................................................................. 13

Clase NP-Completo .................................................................... 13

Clase NP-Duro .......................................................................... 14

Conclusión .................................................................................... 15

Referencias ................................................................................... 16

Page 3: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.

3

INTRODUCCIÓN

Durante el diario vivir las personas se ven enfrentadas a realizar tareas, ¿Cómo

comprar el pan? ¿Cómo construir un edificio? ¿Cómo resolver una ecuación de

varias variables? Mientras las personas planifican intrínsecamente la resolución

de dichas tareas, durante el proceso van generando modelos de resoluciónque

son la estructura necesaria para poder realizar la solución al problema o acción

indicada.

Estos modelos se denominan “algoritmos”. El algoritmo se puede definir como

una serie de instrucciones que son llevadas a cabo de manera secuencial y

brindan un método riguroso para dar una solución al tipo de problema

determinado; adicionalmente debe ser preciso, definido, finito y entregar un

resultado, es decir, no puede ser ambiguo y en cada ejecución debe tener

definido sus elementos de entrada y obligatoriamente terminar y producir una

salida que será el resultado de efectuar las instrucciones. Si bien la resolución de

un problema mediante un computadornecesita un algoritmo y un lenguaje de

programación, usualmente este último se convierte en una traducción del

algoritmo según el lenguaje utilizado.

Dos aspectos importantes al momento de analizar los algoritmos son su diseño y

sueficiencia, el primero refiere a la construcción de métodos y series de

instrucciones adecuadas al problema que se pretende resolver; el

segundopermite medir el costo en tiempo y recursos que consume un algoritmo

para poder llegar a la solución determinada para la cual fue diseñado,

permitiendo comparar según esta variable distintos algoritmos que resuelven el

mismo problema según el uso de recursos del sistema y su tiempo de ejecución.

En este texto estudiaremos la complejidad algorítmica, que es una herramienta para poder analizar mediante la teoría la eficiencia estimada de un algoritmo y dar la posibilidad de comparar los distintos métodos existentes para posibilitar la elección del más eficiente ante un problema dado, sin la necesidad de implementarlos; y además nos entrega la facilidad de poder clasificar dichos problemas según su complejidad.

Page 4: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©Análisis de Algoritmos: Complejidad y Clases de Problemas.

4

COMPLEJIDAD DE ALGORITMOS

¿POR QUÉ ESTUDIAR LACOMPLEJIDAD DE LOS ALGORITMOS?

La existencia de diferentes variantes para poder dar solución a un problema deja

la disyuntiva de cual opción utilizar, las distintas maneras de implementación

conllevan a la inevitable comparación de la cantidad de recursos, en términos de

tiempo y memoria, que usa cada uno de ellos y con ello poder definir su

eficiencia (Menor cantidad de recursos significa mayor eficiencia).

Cuando se habla de eficiencia, se hace referencia específicamente al tiempo que

tarda en ejecutarse y la cantidad de memoria que utiliza, estos dos factores son

lo que en común llamamos complejidad, y se categorizan de la siguiente manera:

complejidad espacial (la cantidad de memoria que consume) y la complejidad

temporal (el tiempo que necesita para resolver un problema) Si bien ambos

resultados nos arrojan el coste del algoritmo, los resultados demostrados en el

libro Introducción a la programación con Python y C(Marzal y Gracia Luengo,

2002)dan a entender que estos factores entrarán a competir y en algunos casos

estaremos obligados a comprometer uno con el fin de mejorar otro.

Por lo mismo antes de comenzar la realización de una aplicación es

recomendable elegir un algoritmo que ocupe pocos recursos, ya lo dijo Brian

Kernighan "Controlar la complejidad es la esencia de la programación de

computadoras."Es mentiroso confiar en la creciente potencia de las máquinas y el

abaratamiento de los costos como solución a las complejidades y el excesivo

consumo de recursos que pueda tener nuestra aplicación; una máquina rápida

sólo nos solucionará el problema si la razón de crecimiento de nuestro algoritmo

es lineal y dependerá de la cantidad de datos.

Es así como el principal interés al estudiar la complejidad de un algoritmo radica

en determinar su complejidad temporal cuando el tamaño de la entrada de datos

crece, esto mediante una expresión que modele la cantidad de operaciones

elementales que se ejecutan en un algoritmo facilitamos la comparación: La

respuesta a ello es: notación asintótica; o bien en ecuaciones de recurrencia para

los casos de algoritmos recursivos.

Page 5: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.

5

NOTACIONES PARA EL CÁLCULO DE LA COMPLEJIDAD

Las notaciones para el cálculo de la complejidad representan una forma de

organizar los algoritmos según su tiempo de ejecución (complejidad temporal),

esta clasificación se basa en cotas. A la hora de medir el tiempo, lo realizamos

en función del número de operaciones elementales que realiza el algoritmo,

donde estas operaciones elementales son aquellas en las que el computador

realiza en un tiempo acotado.

COTA SUPERIOR (NOTACIÓN O)

La notación O, también denominada cota superior, es una función que nos

entrega una cota (o límite) para el mayor tiempo de ejecución y de esta forma

obtener las acotaciones superiores de manera exacta según los valores crecientes

de su entrada. La definición sería (Guillen, 2011):

( ( )) * ( ) | ( ) ( ) +

Esto quiere decir que O (g(n)) es un conjunto de funciones f(n) donde el valor de

estas funciones es siempre menor que un determinado número constante c dado

por ( ) para todos los valores de n mayores a n0, el cual denominamos

tramo inicial.

Esta notación se utiliza mayoritariamente para acotar “el peor caso”, utilizado

en el estudio de algoritmos, que define que cualquier otro tipo de entrada en el

algoritmo tendrá un tiempo de ejecución menor o igual al especificado por esta

función.

Ejemplos

1. ( ) (

)

2. ( ) (

) ( ( )

)

Page 6: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©Análisis de Algoritmos: Complejidad y Clases de Problemas.

6

COTA INFERIOR (NOTACIÓN Ω)

La notación Ω, también denominada cota inferior, es el inverso a la cota de

Orden lo que quiere decir que nos entrega una cota o límite para el menor

tiempo de ejecución. La definición está dada por(Guillen, 2011):

( ( )) * ( ) | ( ) ( ) +

Esto quiere decir que (g(n))es un conjunto de funciones f(n)donde el valor de

estas funciones es siempre mayor a ( ) para todos los valores de n mayores

a n0, el cual denominaremos tramo inicial.

El uso de esta notación se usa de manera recurrente en el estudio de algoritmos

para especificar “el mejor caso”, correspondiente al mejor tiempo de ejecución,

ya que cualquier otro caso tiene que ser forzosamente mayor a éste.

Ejemplos

1. ( ) (

)

2. ( ) (

)

COTA AJUSTA O DE ORDEN EXACTO (NOTACIÓN Θ)

Esta notación es un caso especial, al momento de analizar un algoritmo se puede

encontrar el caso de que esté acotado superior e inferiormente mediante un

número real positivo determinado. A este caso lo denominamos cota ajusta o de

orden exacto y se representa por la notación Θ. La definición está dada por

(Guillen, 2011):

( ( )) ( ( )) ( ( ))

En otras palabras una función f(n) que pertenece a ( ( )) está acotada superior

e inferiormente por funciones proporcionales a g(n) a partir de un valor

determinado de n.

Esta notación se ocupa para encontrar “el caso promedio”.

Page 7: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.

7

Ejemplos

1. ( )

2. ( )

Page 8: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©Análisis de Algoritmos: Complejidad y Clases de Problemas.

8

COMPLEJIDAD DE ALGORITMOS RECURSIVOS

En las notaciones anteriormente estudiadas, el cálculo del tiempo de ejecución

trataba de un simple cálculo a partir de sus operaciones elementales. Este

proceso cambia cuando nos enfrentamos a un algoritmo recursivo debido a que su

tiempo de ejecución se basa en la iteración, es decir la complejidad de un

algoritmo recursivo se expresará a través de una ecuación de recurrencia.

Para resolver este tipo de ecuaciones debemos encontrar una expresión que no

sea recursiva dentro de la misma. Para desarrollar esta acción se pueden seguir

los pasos explicados en el libro Técnicas de Diseño de Algoritmos (Guerequeta y

Vallecillo, 2000) en base a tipos concretos de ecuaciones que se dan con mayor

frecuencia. A continuación se presentan las formas correspondientes más

frecuentes:

Recurrencias Homogéneas: Donde los coeficientes ai son números reales y

k es un número natural entre 1 y N. Estas recurrencias son de la forma:

( ) ( ) ( ) ( )

Recurrencias No Homogéneas: Donde los coeficientes ai y b son números

reales, y p(n) es un polinomio de n de grado d. Para resolverla se debe

convertir en homogénea. Estas recurrencias son de la forma:

( ) ( ) ( ) ( ) ( )

Cambio de variable: Cuando n es potencia de un número real a .

Recurrencias No Lineales: Cuando la ecuación que relaciona T(n) con el

resto de las variables no es lineal, debemos intentar convertirla en una

lineal.

Page 9: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.

9

Ejemplos

1. Sucesión de Fibonacci (Homogénea):

( ) ( ) ( )

Según condiciones iniciales ( ) ( ) . Cambiando ( )

obtenemos su ecuación característica , o lo que es igual a

, cuyas raíces son:

Por lo que:

( √

)

( √

)

Para calcular las constantes c1 y c2 necesitamos utilizar las condiciones

inicialesde la ecuación original, obteniendo:

{

( ) (

)

( √

)

( ) ( √

)

( √

)

Sustituyendo entonces en la ecuación anterior, obtenemos:

( )

√ ( √

)

√ ( √

)

( )

Page 10: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©Análisis de Algoritmos: Complejidad y Clases de Problemas.

10

2. Recursiva Cambio de variable:

Con , la ecuación ( ) ( ) , donde n es una potencia

de ( ) ( ) ( ) . Si podemos escribir la

ecuación como:

( ) ( )

Haciendo el cambio de variable ( ) obtenemos la ecuación:

Cuya solución viene dada por la expresión:

( )

Deshaciendo el cambio que realizamos al principio obtenemos que:

( )

Calculando entonces las constantes a partir de las condiciones iniciales:

( ) ( )

CLASES DE PROBLEMAS

CLASE DE PROBLEMAS Y JUSTIFICACIÓN DEL PROBLEMA

Cuando nos enfrentamos a un problema y tenemos la conciencia de estar frente a

él tratamos de buscar una respuesta lógica, dentro de este contexto uno de los

problemas diarios es la toma de decisiones como por ejemplo: comer o no comer,

salir o no salir, etc.

La computación trata de modelar los problemas, pero no todos los problemas son

iguales, hay problemas de la vida real en la cual su respuesta es demasiada

compleja o aún peor, no se conoce la respuesta en forma absoluta sino una

aproximación según su comportamiento. Es por esto que los problemas se

clasifican según complejidad para ser resueltos.

Page 11: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.

11

PROBLEMAS DE DECISIÓN

Los problemas de decisión son los que pueden tener dos resultados definidos; una

respuesta positiva o negativa (si o no, 1 ó 0).

Estos tipos de problemas se pueden formalizar como los problemas que

verificación de que si un conjunto de símbolos (frase) pertenece o no al conjunto

de frases (lenguaje), denominado lenguaje formal. La importancia de este tipo

de problemas es tal, que casi todas las clasificaciones de problemas pueden ser

tratados como “de decisión”, destacando las clases P y NP (Que trataremos más

adelante).

En resumen, un problema de decisión (cualquier tipo de problema de decisión) se

puede representar por un Lenguaje.

Ejemplos:

1. Testeo de Primalidad: Determinar si un número entero es un

número primo.

2. Ciclo Hamiltoniano: Determinar si existe un camino dentro de un

grafo que recorra todos los otros puntos una sola vez, comenzando y

terminando en el mismo punto.

PROBLEMAS DE LOCALIZACIÓN

Los problemas de localización, tratan de buscar la mejor localidad (ubicación) de

algo dentro de un espacio delimitado. En otras palabras, responden a la pregunta

¿En qué punto estamos dentro del mapa? O en términos más conocidos ¿Cuál es la

región donde se encuentra el punto P?

Ejemplos:

1. Encontrar un punto dentro de un polígono: Este es un problema de

localización dentro de la rama de la geométrica computacional, en los

cuales se utilizan arreglos y coordenadas para encontrar respuesta.

2. Dada la atenuación de las señales eléctricas, las empresas deben utilizar regeneradores para alcanzar nuevos destinos (Algoritmos heurísticos y metaheurísticos para el problema de localización de regeneradores., 2010)

Page 12: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©Análisis de Algoritmos: Complejidad y Clases de Problemas.

12

PROBLEMAS DE OPTIMIZACIÓN.

Los problemas de optimización intentan buscar una solución (la mejor) en un

conjunto de elementos. En forma matemática está dada por las ecuaciones del

tipo máximos y mínimos de una función.

En conclusión un problema de optimización busca encontrar la maximización o

minimización de un criterio determinado (ganancias, tiempo, recursos, etc.)

Ejemplos

1. Determinar las dimensiones indicadas de un contenedor de

líquidos de tal manera que la cantidad a almacenar sea lo menor

posible.

2. Algoritmo Hungariano: Determinar las asignaciones que

representen un menor costo dentro la oferta y la demanda.

CLASES DE PROBLEMAS

CLASE P

Matemáticamente, los problemas se pueden clasificar por su tiempo en la cual se

demora en encontrar la solución, a esto se le llama el tiempo polinomio (Clase

P).

Un problema se puede resolver en un tiempo polinomio, cuando el algoritmo se

puede relacionar con el tamaño de la entrada que tiene. Estos problemas tienen

un comportamiento muy similar a un polinomio lineal.

También se dice que un problema del tipo P, es un problema que se puede

resolver de manera fácil y en un tiempo razonable para la computación actual, la

mayoría de los problemas no son de este tipo.

Ejemplos

1. Ordenar una lista de valores.

2. Buscar el camino mínimo entre dos ciudades en un mapa.

Page 13: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.

13

CLASE NP

Los problemas de clase NP (tiempo polinomial no determinista) (La N significa NO

determinístico y la P es de polinomio), son aquellos que no se pueden resolver en

un tiempo polinomico, son problemas complejos en la cual se requiere mucho

tiempo, y hay veces que solo se puede llegar a una respuesta aproximada, debido

a un tiempo exponencial para la respuesta óptima.

Este tipo de problemas prueba todas las alternativas posibles, ya sea usando

fuerza bruta u otros métodos.

Ejemplos

1. Factorización de números primos.

2. BinPacking, que consiste en dada una secuencia de números,

empaquetarlos en el mínimo número de latas posible, teniendo en

cuenta que cada lata tiene capacidad M y la suma de sus números

introducidos en la lata no puede exceder el valor M.

CLASE NP-COMPLETO

La clase de problemas NP-Completo, es un subconjunto de los problemas NP, sin

embargo son los problemas más difíciles dentro de esta categoría, por tanto la

gran mayoría no pertenece a la clase de complejidad P. El motivo de esto es que

si se tiene una solución polinómico para este tipo de problemas, todos los

problemas NP tendrían una solución en tiempo polinómico. Un problema NP-

Completo es aquel que puede convertirse en otro problema NP en un tiempo

polinomial aceptable.

Ejemplos

1. Uno de los más clásicos es el del viajante el cual consiste en

recorrer todas las ciudades de un mapa sin repetir ninguna, y

volviendo al punto de partida.

2. La resolución de un sudoku.

Page 14: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©Análisis de Algoritmos: Complejidad y Clases de Problemas.

14

CLASE NP-DURO

Esta categoría, a pesar de su nombre, no es una subcategoría de los problemas

NP. La clase de los problemas NP-duros las podemos definir que si suponiendo

que tenemos una solución para el problema en tiempo constante, podemos

utilizar dicha solución para resolver un problema NP-Completo en tiempo lineal.

Un problema NP-Duro es cualquier tipo de problema, que no necesariamente

pertenece al conjunto de la clase NP. Por ejemplo si se tiene una solución

exponencial a un problema NP-Duro que puede ser convertido a una solución

exponencial de un problema NP, pero puede que tenga otra solución que se

realice en tiempo polinómico. En otras palabras, estos resultados son utilizados

para demostrar que ciertos problemas de NP-Completo son “presuntamente”

intratables.

Ejemplos

1. El problema de la suma de subconjuntos: dado un conjunto S de

enteros, ¿existe un subconjunto no vacío de S cuyos elementos

sumen cero?

2. El problema de parada: consiste en tomar un programa y sus datos y

decidir si va a terminar o se ejecuta indefinidamente.

Page 15: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.

15

CONCLUSIÓN

Se puede concluir que los métodos descritos anteriormente del cálculo de

complejidad de algoritmos, pueden llegar a ser fundamentales a la hora de

desarrollar aplicaciones computacionales. Esto se puede afirmar ya que estos

métodos se utilizan con el fin de optimizar los recursos utilizados con respecto

al tiempo de ejecución de la aplicación, lo que lleva a que una mayor cantidad

de máquinas sean capaces de soportar la aplicación desarrollada de forma

óptima.

Por otro lado, las clases de problema aportan al definir de qué tan complejo es el

problema a tratar, ya que sin esto se tendería a “atacar” cualquier problema de

la misma forma, lo cual llevaría a una sucesión de fracasos o aún peor, no

solucionar por completo el problema que se presenta.

Page 16: Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo

©Análisis de Algoritmos: Complejidad y Clases de Problemas.

16

REFERENCIAS

Diaz, A. (2003). Sección de Computación - Analisis y Complejidad de Algoritmos.

Recuperado el 27 de 03 de 2013, de Completitud NP:

http://delta.cs.cinvestav.mx/~adiaz/anadis/NPCompleteness2k5.pdf

Gracia Luengo, I., & Marzal, A. (2002). Introducción a la programación con

Python y C. Castellón, España: Publicacions de la Universitat Jaume I.

Guerequeta, R., & Vallecillo, A. (2000). Tecnicas de Diseño de Algoritmos (2°

ed.). Malaga, España: Publicaciones de la Universidad de Malaga.

Guillen, P. (2011). Algoritmos - Cotas de Complejidad. Recuperado el 27 de 03

de 2013, de http://pier.guillen.com.mx/algorithms

Hernandez, F., & Rocha, S. (2003). Analisis, Diseño e Implementación de

Algoritmos. Coyoacán, México: Fondo Editorial FCA, Universidad Nacional

Autónoma de México.

Martin, G., Toledo, F., & Cerverón, V. (1995). Fundamentos de Informática y

Programación. Valencia, España: Universidad de Valencia.

Rodriguez, O. (2010). Algoritmos heurísticos y metaheurísticos para el problema

de localización de regeneradores. España: Universidad Rey Juan Carlos.