Fundamentos Computación - Complejidad Algoritmica y Clases de Problemas P, NP, NP-Duro, NP-Completo
-
Upload
oscar-bravo -
Category
Documents
-
view
93 -
download
5
Transcript of 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
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
©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.
©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.
©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. ( ) (
) ( ( )
)
©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”.
©2013 de Oscar Bravo, Yasser Isa y Francisco Madrid.
7
Ejemplos
1. ( )
2. ( )
©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.
©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:
( )
√ ( √
)
√ ( √
)
( )
©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.
©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)
©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.
©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.
©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.
©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.
©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.