Análisis de algoritmos

Documentos relacionados
Análisis de algoritmos

Teoría y Complejidad Algorítmica

Tema: Programación Dinámica.

Tema: Programación Dinámica.

Programa de teoría. Algoritmos y Estructuras de Datos II. 3. Algoritmos voraces. 1. Análisis de algoritmos 2. Divide y vencerás

Programación Dinámica

Programación Dinámica

Programación Dinámica

Programación dinámica

Tema 5- Diseño Recursivo y. Objetivos Principales. Bibliografía Básica

Análisis de algoritmos. Recursividad

Practica 04: Soluciones Recursivas

Análisis de algoritmos

Tema: Programación Dinámica.

Tema 06: Recursividad

Recursividad... un análisis posterior. Aurelio Sanabria Introducción a la programación

Estrategias de Diseño de Algoritmos

Diseño y Análisis de Algoritmos

Programación Dinámica

Programación Dinámica 1

Programación Dinámica

Backtracking: Esquema General

259. El número de combinaciones de m objetos entre un conjunto de n, denotado por n, para n 1 y 0 m n, se puede definir recursivamente por: m

Recursividad... un análisis posterior. Jaime Gutiérrez Alfaro Introducción a la programación

Programación II Recursividad Dr. Mario Rossainz López

Diseño de algoritmos

Tema 02: Algoritmia y pseudocódigo

Parte de Algoritmos de la asignatura de Programación Master de Bioinformática. Divide y vencerás

Programación dinámica

Practica 03: Eliminación Gaussiana

Teoría de los Lenguajes de Programación Práctica curso Enunciado. Fernando López Ostenero y Ana García Serrano

Divide-y-vencerás, backtracking y programación dinámica

Divide & Conquer. Herman Schinca. Clase de Junio de 2011

4.2. El número de combinaciones de m objetos entre un conjunto de n, denotado por n, para n 1 y 0 m n, se puede definir recursivamente por: m

Análisis y Diseño de Algoritmos (AyDA) Isabel Besembel Carrera

4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es

Qué es la recursividad?

Análisis de algoritmos

1. PRINCIPIOS BÁSICOS DE PROGRAMACIÓN

Ejemplo: El problema de la mochila. Algoritmos golosos. Algoritmos y Estructuras de Datos III. Segundo cuatrimestre 2013

Tema: Funciones, Procedimientos y Recursividad en C#.

Análisis de algoritmos

Tema 9. Recursividad

Tema 10: Árbol binario de búsqueda

Análisis de algoritmos

Estructuras de Datos. Practica 06: Codificación de Huffman

Tema 3.2: Eficiencia de algoritmos recursivos. Diseño y Análisis de Algoritmos

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Análisis de algoritmos

Análisis de algoritmos

Tema: Funciones, Procedimientos y Recursividad en C#.

Tema: Funciones, Procedimientos y Recursividad en C#.

Análisis de algoritmos

Análisis de algoritmos

Practica 01: Evaluación de expresiones infijas

Técnicas de diseño de algoritmos Divide y Vencerás

PROGRAMACION ESTRUCTURADA: Tema 3. Funciones

Tema 7: Recursividad

La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

Algorítmica y Lenguajes de Programación. Algoritmos voraces y divide y vencerás

Algoritmos. Diseño de algoritmos por inducción. Alberto Valderruten. Dept. de Computación, Universidade da Coruña

Programación I Recursividad.

Taller de Programación Dinámica

Jueves, 30 de abril. Ejemplo de recursión. Ejemplo de PD. Ejemplo de programación dinámica. Programación dinámica

Tema: Funciones, Procedimientos y Recursividad en C#.

Todos los Pares de Rutas más Cortas (All-Pairs Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

Algoritmos mas complejos. Algoritmos y Estructuras de Datos II (Programación I) Mgter. Vallejos, Oscar A.

Trabajo Práctico Nº 06

Programación 2. Lección 3. Introducción a la recursividad

Practica 03: Uso de expresiones regulares en Python

Tema 18: Memoria dinámica y su uso en C

Análisis de algoritmos

Taller de Programación Dinámica. Definiciones. Caso base. Laboratorio de Algoritmos y Estructuras de Datos III. 10 de Septiembre de 2010

Practica 02: Simulaciones con el TAD Cola

Algoritmos glotones. mat-151

Clase 16: GLC s recursivas y no factorizadas Solicitado: Ejercicios 13: Recursividad y factorización de gramáticas

Geometría. Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires. Training Camp 2012

Resolución de Problemas y Algoritmos Segundo cuatrimestre 2015 Clase 11: Construcción de primitivas (Funciones)

Tema 14: Arreglos estáticos en C

Análisis de algoritmos

Análisis de algoritmos

Complejidad de algoritmos recursivos

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero

Técnicas de diseño de algoritmos Programación dinámica

Tema 05: Tablas hash. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Transcripción:

Tema 09: Programación dinámica Solicitado: Ejercicios 06: Programación dinámica de Fibonacci y Coeficientes Binomiales M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom 1

Contenido Introducción Programación dinámica Enfoques de la programación dinámica Principio de optimalidad Diseño de un algoritmo de programación dinámica Ejemplos Fibonacci Cálculo del coeficiente binomial Ejercicios 06: Programación dinámica de Fibonacci y Coeficientes Binomiales 2

Introducción La técnica divide y vencerás señala que es posible dividir un problema en subproblemas y combinar las soluciones para resolver el problema original. En ocasiones resolver subproblemas nos lleva a considerar subproblemas idénticos. Si aprovechamos la duplicación, resolviendo cada problema una sola vez, guardando la solución para su uso posterior entonces tendremos un algoritmo más eficiente. 3

La idea de la programación dinámica es evitar repetición de cálculos. La base de la programación dinámica es el razonamiento inductivo: Como resolver un problema combinando soluciones para problemas más pequeños? Se resuelven primero los subproblemas más pequeños y por tanto más simples. Combinando las soluciones se obtienen las soluciones de ejemplares sucesivamente más grandes hasta llegar al ejemplar original. 4

Programación dinámica La programación dinámica es un método para reducir el tiempo de ejecución de un algoritmo mediante la utilización de subproblemas superpuestos y subestructuras óptimas. Una subestructura óptima significa que se pueden usar soluciones óptimas de subproblemas para encontrar la solución óptima del problema en su conjunto. Un problema tiene subproblemas superpuestos si se usa un mismo subproblema para resolver diferentes problemas mayores. 5

Los algoritmos divide y vencerás están dentro de los métodos descendentes. Empezar con el problema original y descomponerlo en pasos sucesivos en problemas de menor tamaño. La programación dinámica por el contrario, es un método ascendente: Resolver primero los problemas pequeños (guardando las soluciones) y después combinarlas para resolver problemas más grandes. La programación dinámica hace uso de: Subproblemas superpuestos Subestructuras óptimas Memoizacion 6

En general, se pueden resolver problemas con subestructuras óptimas siguiendo estos tres pasos: 1. Dividir el problema en subproblemas más pequeños. 2. Resolver estos problemas de manera óptima usando este proceso de tres pasos recursivamente. 3. Usar estas soluciones óptimas para construir una solución óptima al problema original. Los subproblemas se resuelven a su vez dividiéndolos en subproblemas más pequeños hasta que se alcance el caso fácil, donde la solución al problema es trivial. 7

Los subproblemas superpuestos provocan resolver varias veces el mismo problema, ya que la solución de un subproblema requiere calcular soluciones que otro subproblema también tenga que calcular. Perder tiempo calculando varias veces la solución al mismo subproblema se puede evitar guardando las soluciones que ya hemos calculado. Entonces, si necesitamos resolver el mismo problema más tarde, podemos obtener la solución de la lista de soluciones calculadas y reutilizarla. Este acercamiento al problema se llama memoización (no confundir con memorización; en inglés es llamado memoization). En programación dinámica comúnmente se utilizan tablas de resultados conocidos que se va generando a medida que se resuelven los subcasos. 8

Originalmente, el término de programación dinámica se refería a la resolución de ciertos problemas y operaciones fuera del ámbito de la Ingeniería Informática, al igual que hacía la programación lineal. Aquel contexto no tiene relación con la programación en absoluto; el nombre es una coincidencia. El término también lo usó en los años 40 Richard Bellman, un matemático norteamericano, para describir el proceso de resolución de problemas donde hace falta calcular la mejor solución consecutivamente. Algunos lenguajes de programación funcionales, sobre todo Haskell, pueden usar la memorización automáticamente sobre funciones con un conjunto concreto de argumentos, para acelerar su proceso de evaluación. Esto sólo es posible en funciones que no tengan efectos secundarios. 9

Donde tiene mayor aplicación la Programación Dinámica es en la resolución de problemas de optimización. En este tipo de problemas se pueden presentar distintas soluciones, cada una con un valor, y lo que se desea es encontrar la solución de valor óptimo (máximo o mínimo). La solución de problemas mediante esta técnica se basa en el llamado principio de óptimo enunciado por Bellman en 1957 y que dice: En una secuencia de decisiones óptima toda subsecuencia ha de ser también óptima. 10

Enfoques de la programación dinámica Top-down: El problema se divide en subproblemas, y estos se resuelven recordando las soluciones por si fueran necesarias nuevamente. Es una combinación de memoización y recursión. Bottom-up: Todos los problemas que puedan ser necesarios se resuelven de antemano y después se usan para resolver las soluciones a problemas mayores. Este enfoque es ligeramente mejor en consumo de espacio y llamadas a funciones, pero a veces resulta poco intuitivo encontrar todos los subproblemas necesarios para resolver un problema dado. 11

Principio de optimalidad Cuando hablamos de optimizar nos referimos a buscar alguna de las mejores soluciones de entre muchas alternativas posibles. Dicho proceso de optimización puede ser visto como una secuencia de decisiones que nos proporcionan la solución correcta. En este caso sigue siendo posible el ir tomando decisiones elementales, en la confianza de que la combinación de ellas seguirá siendo óptima, pero será entonces necesario explorar muchas secuencias de decisiones para dar con la correcta, siendo aquí donde interviene la programación dinámica. 12

En una secuencia de decisiones óptima toda subsecuencia ha de ser también óptima Contemplar un problema como una secuencia de decisiones equivale a dividirlo en problemas más pequeños y por lo tanto más fáciles de resolver como hacemos en Divide y Vencerás. La programación dinámica se aplica cuando la subdivisión de un problema conduce a: Una enorme cantidad de problemas. Problemas cuyas soluciones parciales se solapan. Grupos de problemas de muy distinta complejidad. 13

Diseño de un algoritmo de programación dinámica Para que un problema pueda ser abordado por esta técnica ha de cumplir dos condiciones: La solución al problema ha de ser alcanzada a través de una secuencia de decisiones, una en cada etapa. Dicha secuencia de decisiones ha de cumplir el principio de optimalizad. 14

El diseño de un algoritmo de Programación Dinámica consta de los siguientes pasos: 1. Planteamiento de la solución como una sucesión de decisiones y verificación de que ésta cumple el principio de óptimo. 2. Definición recursiva de la solución. 3. Cálculo del valor de la solución óptima mediante una estructura de datos en donde se almacenan soluciones a problemas parciales para reutilizar los cálculos. 4. Construcción de la solución óptima haciendo uso de la información contenida en la estructura de datos. 15

Fibonacci Ο(c n ) 16

Si se llama a fib(5), se produce un árbol de llamadas que contendrá funciones con los mismos parámetros varias veces: 1. fib(5) 2. fib(4) + fib(3) 3. (fib(3) + fib(2)) + (fib(2) + fib(1)) 4. ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 5. (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) En particular, fib(2) se calcula dos veces. En ejemplos mayores, se recalculan muchos otros valores de fib, o subproblemas. Para evitar este inconveniente, se puede resolver el problema mediante programación dinámica, y en particular, utilizando el enfoque de memorización (guardar los valores que ya han sido calculados para utilizarlos posteriormente). Así, rellenaríamos una tabla con los resultados de los distintos subproblemas, para reutilizarlos cuando haga falta en lugar de volver a calcularlos. La tabla resultante sería una tabla unidimensional con los resultados desde 0 hasta n. 17

Fibonacci utilizando (Programación dinámica - Buttom-up) int fibonacci(int n) { int i; if (n<2) { return n; } else { tabla[0] = 0; tabla[1] = 1; for(i = 2; i < n; i++) tabla[i] = tabla[i-1] + tabla[i-2]; } return tabla[n-1]; } Ο(n) 18

Fibonacci utilizando (Programación dinámica -Top-down) int tabla[n]; // tabla {-1,-1,,-1} int fibonacci(int n) { if (n<2) return n; if(tabla[n-1] == -1) tabla[n-1] = fibonacci(n-1); Ο(n) if(tabla[n-2] == -1) tabla[n-2] = fibonacci(n-2); tabla[n] = tabla[n-1] + tabla[n-2]; return tabla[n]; } 19

Cálculo del coeficiente binomial Los coeficientes binomiales o números combinatorios son una serie de números estudiados en combinatoria que indican el número de formas en que se pueden extraer subconjuntos a partir de un conjunto dado. Sin embargo, dependiendo del enfoque que tenga la exposición, se suelen usar otras definiciones equivalentes. P.g. Se tiene un conjunto con 6 objetos diferentes {A,B,C,D,E,F}, de los cuales se desea escoger 2 (sin importar el orden de elección). Cuántas formas de elección existen? A,B A,C A,D A,E A,F B,C B,D B,E B,F C,D C,E C,F D,E D,F E,F 20

El número de formas de escoger k elementos a partir de un conjunto de n, puede denotarse de varias formas: C (n, k), n C k C(6,2) = 15 Los números C(n,k) se conocen como coeficientes binomiales, pero es frecuente referirse a ellos como combinaciones de n en k, o simplemente n en k. n El coeficiente binomial es el número de subconjuntos k de k elementos escogidos de un conjunto con n elementos El coeficiente binomial n k n k = n! k! n k! está dado por la fórmula 21

Forma recursiva del coeficiente binomial n k = 1 n 1 k 1 + n 1 k 0 si k = 0 o k = n si 0 < k < n en caso contrario Si se desea calcular C(5,3), Cuáles son los casos que se repiten? funcion C(n,k) { Si k = 0 o k = n entonces devolver 1 sino si 0 < k< n devolver C(n-1,k-1) + C(n-1,k) sino devolver 0 } 22

El algoritmo recursivo que los calcula resulta ser de complejidad exponencial por la repetición de los cálculos que realiza. No obstante, es posible diseñar un algoritmo con un tiempo de ejecución de orden O(nk) basado en la idea del Triángulo de Pascal. Para ello es necesario la creación de una tabla bidimensional en la que ir almacenando los valores intermedios que se utilizan posteriormente. 23

Se ira construyendo la tabla por filas de arriba hacia abajo y de izquierda a derecha mediante el siguiente algoritmo de complejidad polinómica (Bottom-up). int coef_bino(int n, int k) { int i, j; for(i = 0; i <= n; i++) tabla[i][0] = 1; for(i = 1; i<= n; i++) tabla[i][1] = i; for(i = 2; i<= k; i++) tabla[i][i] = 1; } for(i = 3; i <= n; i++) for(j = 2; j <= i-1; j++) if(j <= k) tabla[i][j] = tabla[i-1][j-1] + tabla[i-1][j]; return tabla[n][k]; 24

Resultado Triangulo de Pascal 25

Ejercicios 06: Programación dinámica de Fibonacci y Coeficientes Binomiales Entender e implementar los algoritmos basados en programación dinámica de Fibonacci (top down y botton up) y de coeficientes binomiales. Describir de manera detallada los algoritmos y su implementación. *Se entregará antes del día Martes 23 de Junio de 2015 (23:59:59 hora limite). *Incluir la redacción de cada ejercicio *Portada y encabezados de pagina *Enviar códigos y documento en un archivo comprimido 26 1.