1. Planteamiento general

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

Análisis de algoritmos

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

Tema 2. Divide y vencerás.

Algoritmos y Estructuras de Datos Curso 06/07. Ejercicios

TEMA 1: DIVIDE Y VENCERÁS

Esquema de Dividir y Vencer

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

Técnicas para el Diseño de Algoritmos

Estructuras de Datos y Algoritmos. Curso 2009/2010. Tema 3: Divide y Vencerás

ANÁLISIS Y DISEÑO DE ALGORITMOS

1. Algoritmo, programa y pseudocódigo. Introducción al estudio de algoritmos. Ejemplos

Introducción Supongamos un subconjunto de n elementos X = {e 1,,e n de un conjunto referencial Y, X Y. Dentro de Y se define una relación de orden tot

Programación II. Mario Aldea Rivas Programación II 13/04/11 1. Mario Aldea Rivas Programación II 13/04/11 2

Decrementa y vencerás II

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

Tema 9. Recursividad

Dividir-conquistar y podar-buscar

Algorítmica y Complejidad. Tema 5 Divide y Vencerás.

1. Introducción al análisis de algoritmos

Multiplicación de enteros Algoritmo clásico 1234*5678 = 1234* (5* *100+7*10+8) = 1234*5* *6* *7* *8 Operaciones bási

Análisis de Algoritmos Primer Problemario Prof. Miguel A. Pizaña 22 de Mayo de 2007

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

ANÁLISIS Y DISEÑO DE ALGORITMOS. PRACTICAS

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

1. 1. Introducción al concepto de algoritmia

Análisis matemático de algoritmos no recursivos

PARTE II: ALGORÍTMICA

Multiplicación de matrices simétricas

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

Tema 3. Análisis de costes

1/16. Coste de Algoritmos. 8 de abril de 2018

Divide y vencerás. Diseño y Análisis de Algoritmos

Algoritmos y Complejidad

Tema 5- Diseño Recursivo y Eficiente. Tema 5- Diseño Recursivo y. Descomposición recursiva ascendente de un vector. Etapas del diseño recursivo

Conceptos Fundamentales del Análisis de Algoritmos II

Demostrando cotas inferiores: Arboles de decisión

MATRICES MULTIPLICACIÓN DE MATRICES

Estructura de datos y Algoritmos. Tema III Clasificación en memoria secundaria

Capitulo 2 La técnica Divide y Vencerás

Análisis de Algoritmos

Análisis de Algoritmos

Análisis de Algoritmos

Complejidad de algoritmos recursivos

Algoritmos sobre Listas

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

Métodos de Ordenamiento. Unidad VI: Estructura de datos

Ordenamiento (Sorting)

Introducción al Análisis del Coste de Algoritmos

Algoritmos de Ordenamiento

Análisis asintótico de algoritmos

TEMA 7. ALGORITMOS DE BÚSQUEDA, ORDENACIÓN

CI2612: Algoritmos y Estructuras de Datos II. Recurrencias y el principio de dividir y conquistar. Recurrencias. Objetivos.

Análisis Amortizado. Diseño y Análisis de Algoritmos Cátedra de Programación Carrera de Ingeniería de Sistemas Prof. Isabel Besembel Carrera

Divide y vencerás. Dr. Eduardo A. RODRÍGUEZ TELLO. 7 de marzo de CINVESTAV-Tamaulipas

Capítulo 3. Clasificación en Memoria Secundaria

Algoritmos de Ordenación

Algorítmica y Lenguajes de Programación. Eficiencia y notación asintótica (i)

Notación Asintótica. Temas. Introducción Notación O Notación Omega Notación Theta. Análisis de Algoritmos

Algorítmica y Lenguajes de Programación. Eficiencia y notación asintótica (ii)

Programación Análisis de Algoritmos: Tiempo de Ejecución (Introducción)

Programación de Sistemas

Algoritmos: Análisis de Algoritmos

95.12 Algoritmos y Programación II Práctica 7: árboles

Divide y Vencerás Programación Dinámica

Curso de Programación 1

Diseño y Análisis de Algoritmos

Unidad 4. Arreglos y Cadenas

Análisis de Algoritmos CB-102

11-Ordenar Definiciones 11.2 Selección 11.3 Intercambio 11.4 Inserción 11.5 Shellsort 11.6 Quicksort 11.7 Mergesort.

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

Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos

Temario. Tipos de recursión. Eficiencia y recursión

Análisis de algoritmos

Recursividad. 1.1 Concepto de Recursividad. Objetivos. Metodología de la Programación II Entender el concepto de recursividad.

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

Estrategias de Diseño de Algoritmos

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

Estructura de datos y de la información Boletín de problemas - Tema 9

Análisis y Diseño de Algoritmos. Complejidad Computacional

Tema 1. ORDENACIÓN, BÚSQUEDA E INTERCALACIÓN INTERNA (Algoritmos)

Algorítmica y Lenguajes de Programación. Ordenación (ii) En la lección anterior se vieron dos métodos de ordenación:

Algoritmos y Estructuras de Datos II, Segundo del Grado de Ingeniería Informática, Test de Programación Dinámica, 4 de mayo 2017

Bloque 1. Conceptos y técnicas básicas en programación

Universidad de Valladolid Departamento de Informática

NOTACIÓN O GRANDE. El análisis de algoritmos estima el consumo de recursos de un algoritmo.

Métodos de ordenamiento:

<tipo> Tipo de dato de los elementos del vector

Algoritmos de fuerza bruta

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

Programación 2. Lección 8. Caracterización asintótica de la eficiencia de un algoritmo

Algoritmos Cuánticos

MATEMÁTICAS 5. º CURSO UNIDAD 1: SISTEMAS DE NUMERACIÓN

Métodos de ordenamiento:

Análisis y Diseño de Algoritmos

Algorítmica: Análisis de Algoritmos

Tema 2 Fundamentos de Complejidad Algorítmica

Transcripción:

Algoritmos de tipo Divide y Vencerás 1. Planteamiento general 2. Determinación del caso base 3.1. Búsqueda binaria 3.3. Problema de la selección 3.4. Multiplicación de matrices de Strassen 1. Planteamiento general Idea general Descomponer un problema en subproblemas (más pequeños) Resolver cada subproblema Combinar las soluciones

1. Planteamiento general Función DV(X: Datos del problema) si pequeño(x) entonces sino devolver S S = sencillo(x) (X1,..., Xl) = descomponer(x) para i = 1 hasta l hacer Si = DV(Xi) S = combinar(s1,..., Sl) 1. Planteamiento general Asumiendo la existencia de pequeño(x) - función booleana que determina si es práctico aplicar sencillo(x) sencillo(x) - algoritmo práctico para el problema si su tamaño es suficientemente pequeño descomponer(x) - función que descompone P en l subproblemas P1,..., Pl con entradas X1,..., Xl combinar(s1,..., Sl) - función que combina l soluciones Si para Pi, en una única para P

1. Planteamiento general Efectividad del enfoque Debe elegirse correctamente el umbral a partir del cual aplicar sencillo(x) Las funciones de descomposición y combinación deben ser eficientes Los subproblemas deben ser aproximadamente del mismo tamaño 1. Planteamiento general Complejidad pequeño(x) tarda un tiempo asimilable a otras funciones del esquema sencillo(x) tarda f(n) descomponer(x) y combinar(s1,... Sl) tardan entre los dos g(n) el tamaño de cada subproblema es de n/b

Complejidad 1. Planteamiento general t(n) = f(n) si pequeño(x) t(n) = l.t(n/b) + g(n) en otro caso y si g(n) θ(n k ) t(n) θ(n k ) t(n) θ(n k.log n) t(n) θ(n log l ) si l < b k si l = b k si l > b k 1. Planteamiento general Observación Si l = número de subproblemas Y n/b = tamaño de los subproblemas No necesariamente l = b!!!

1. Planteamiento general Ejemplo (Multiplicación de grandes enteros) Multiplicar dos números a y b enteros muy grandes Algoritmo clásico θ(n 2 ) con n = número de cifras del mayor de los números 1. Planteamiento general Ejemplo (Multiplicación de grandes enteros) Enfoque DyV1 Dividir cada número en n/2 cifras Ejemplo a = 981, b = 1234 w = 09, x = 81 y = 12, z = 34 a. b = (10 2 w + x)(10 2 y + z) = 10 4 wy + 10 2 (wz + xy) + xz = 1080000 + 127800 + 2754 = 1210554

1. Planteamiento general Ejemplo (Multiplicación de grandes enteros) Complejidad DyV1 t(n) = 1 si n = 1 t(n) = 4.t(n/2) + n en otro caso => t(n) θ(n 2 ) 1. Planteamiento general Ejemplo (Multiplicación de grandes enteros) Enfoque DyV2 No calcular (wz + xy) = (w + x)(y + z) - wy - xz p = wy, q = xz, r = (w + x)(y + z) a. b = 10 4 p + 10 2 (r - p - q) + q

1. Planteamiento general Ejemplo (Multiplicación de grandes enteros) Complejidad DyV2 Usando el algoritmo clásico para p, q, r, ahorramos 25% Además t(n) = 1 si n = 1 t(n) = 3.t(n/2) + n en otro caso => t(n) θ(n log3 ) = θ(n 1.585 ) 2. Determinación del caso base Ejemplo (Multiplicación de grandes enteros) Supongamos que usamos el algoritmo DyV2 con t(n) = h(n) si n n 0 t(n) = 3.t(n/2) + g(n) en otro caso siendo h(n) = n 2 µs el tiempo de la multiplicación clásica y g(n) = 16n µs el tiempo de las sumas

2. Determinación del caso base La elección del umbral de aplicación de sencillo(x) (es decir, pequeño(x)) es fundamental Si no se elige adecuadamente, el enfoque D y V es muy ineficiente 2. Determinación del caso base Ejemplo (Multiplicación de grandes enteros) Si n 0 = 1 DyV2 tarda 41 segundos para 5000 cifras M. Clásica tarda 25 segundos para 5000 cifras Si n 0 = 64 DyV2 tarda 6 segundos para 5000 cifras

2. Determinación del caso base El umbral depende de los algoritmos las implementaciones Cálculo del umbral Calcular la complejidad de los algoritmos Calcular las constantes de la implementación Calcular el n 0 tal que los tiempos del algoritmo DV y del clásico coincidan en él Problema 3.1. Búsqueda binaria Dada una matriz T de n componentes ordenada crecientemente (T[i] T[i+1]), y dado un elemento x, encontrar el i tal que 1 i n+1 T[i-1] < x T[i] Observación Si x no está en T, se pide dónde debería estar

3.1. Búsqueda binaria Solución clásica (secuencial) Función bsecuencial(t: matriz [1..n] de entero, x: entero) : entero para i = 1 hasta n hacer si (x T[i]) entonces devolver i devolver n+1 3.1. Búsqueda binaria Complejidad (secuencial) O(n) en el caso peor Ω(1) en el caso mejor θ((n+1)/2) = θ(n) en media

3.1. Búsqueda binaria Enfoque Divide y Vencerás (binaria) Dividir la matriz en dos partes de igual tamaño Buscar en una sola de las dos partes (Para reducir el número de llamadas, mirar primero si x puede estar en la matriz) 3.1. Búsqueda binaria Función bbinaria(t: matriz [1..n] de entero, x: entero) : entero si ((n = 0) o (x > T[n])) entonces devolver n+1 sino devolver brecursiva(t,1,n,x)

3.1. Búsqueda binaria Función brecursiva(t: matriz [1..n] de entero, i,j,x: entero) : entero si (i = j) entonces devolver i k = (i+j) div 2 si x T[k] entonces devolver brecursivo(t,i,k,x) sino devolver brecursivo(t,k+1,j,x) Complejidad 3.1. Búsqueda binaria t(n) = 1 si n = 1 t(n) = t(n/2) + g(n) si n = 2 i, n > 1 con g(n) θ(1) => t(n) θ(log 2 n) = θ(log n)

Observaciones 3.1. Búsqueda binaria Perdemos eficiencia en el caso mejor El caso mejor de bsecuencial es más general Ganamos eficiencia en todos los demás casos La versión iterativa de bbinaria es equivalente en tiempo Problema Dada una matriz T de n componentes, ordenarla ascendentemente T[i] T[i+1] para 1 i n-1 Disponemos de dos algoritmos que ordenan matrices en tiempo O(n 2 ) Ordenación por selección Ordenación por inserción

Idea de un algoritmo de tipo D y V Descomponer la matriz original en dos partes Ordenar cada parte por separado Combinar las partes ordenadas Dos enfoques Descomposición simple, combinación compleja Descomposición compleja, combinación simple Ordenación por mezcla Dividir la matriz por la mitad Ordenar cada mitad Mezclar las mitades ordenadas Precisa espacio auxiliar (no es in situ)

Procedimiento ordmezcla(t: matriz [1..n+1] de entero, i,j: entero) U, V: matriz [1..n+1] de entero si (i < j) entonces k = (i+j) div 2 para l = i hasta k hacer U[l] = T[l] para l = k+1 hasta j hacer V[l] = T[l] ordmezcla(u,i,k) ordmezcla(v,k+1,j) mezclar(u,v,t,k) Procedimiento mezclar(u,v,t: matriz [1..n+1] de entero, i,j,k: entero) U[k+1] = ; V[j+1] = {marcadores para evitar comparaciones} i1 = i; j1 = k+1 {índices} para k2 = i hasta j hacer si (U[i1] < V[j1]) entonces T[k2] = U[i2] i2 = i2 +1 sino T[k2] = V[j2] j2 = j2 +1

Complejidad La descomposición y la mezcla se hacen en tiempo lineal t(n) = 2t(n div 2) + g(n) si n es par t(n) = t(n div 2) + t(n div 2 +1) + g(n) si n es impar t(n) = 2t(n/2) + g(n) si n = 2 i con g(n) θ(n) Complejidad t(n) θ(n.log 2 n) Precisa mucho espacio auxiliar Caso base: j -i suficientemente pequeño => ordenar por inserción

Ordenación rápida (Hoare) Se elige un elemento pivote Se desplazan a un lado los elementos menores que él y a otro los mayores Se ordenan las submatrices No hace falta combinar los resultados Observaciones Para que los subcasos queden equilibrados, la elección ideal del pivote es la mediana La descomposición no debe necesitar espacio auxiliar (in situ) debe hacerse en una sola pasada

Procedimiento pivote(t: matriz [1..n] de entero, i,j, var l: entero) p = T[i]; k = i; l = j+1 repetir k = k+1 hasta (T[k] > p ó k j) repetir l = l -1 hasta (T[l] p) mientras (k < l) hacer intercambiar(t,k,l) repetir k = k+1 hasta (T[k] > p) repetir l = l -1 hasta (T[l] p) intercambiar(t,i,l) Procedimiento ordrapida(t: matriz [1..n] de entero, i,j: entero) si (i < j) entonces pivote(t,i,j,l) ordrapida(t,i,l-1) ordrapida(t,l+1,j)

Complejidad El tamaño de los subproblemas depende de la posición donde va el elemento pivote La posición del pivote depende de los datos del problema Estudio del mejor y peor casos, y en media Complejidad (peor caso) El peor caso se da cuando los subproblemas están más desequilibrados (por ejemplo, T ordenada) t(n) = t(n-1) + t(1) + g(n) con g(n) θ(n) (cálculo del pivote) => t(n) θ(n 2 )

Complejidad (mejor caso) El mejor caso se da cuando los subproblemas están perfectamente equilibrados (por ejemplo, cuando el elemento pivote es siempre la mediana de la submatriz correspondiente) t(n) = 2t(n/2) + g(n) si n = 2 i con g(n) θ(n) => t(n) θ(n.log n) Complejidad (en media) Suposiciones Los n elementos de T son distintos pivote(t,1,n,l) asigna a l una posición cualquiera entre 1 y n => todas las posiciones equiprobables Se estudia el número medio de llamadas y operaciones adicionales => t(n) θ(n.log n)

Observaciones Una versión práctica Tomar la mediana de T[1], T[n/2], T[n] Situación general Los elementos se repiten => modificar pivote(t,i,j,l) para obtener pivote(t,i,j,k,l) de modo que entre k y l estén los elementos repetidos Se puede lograr θ(n.log n) pero con una constante oculta alta Problema 3.3. Problema de la selección Dada una matriz T de n componentes con elementos desordenados, encontrar el k-esimo elemento más pequeño Si k = 1, se busca el mínimo Si k = n, se busca el máximo Si k = n/2, se busca la mediana (elemento que deja a su izda. el 50% de los datos, y a su dcha. el otro 50%) Si k = 1/4, 1/2 y 3/4, se buscan los cuartiles Si k = 1/10, 1/5, 3/10,..., 9/10, se buscan los deciles

3.3. Problema de la selección Algoritmo sencillo Ordenar la matriz Seleccionar el elemento en la posición k Complejidad Usando la ordenación rápida O(n 2 ) en el caso peor O(n.log n) en el caso mejor y en media Opción 3.3. Problema de la selección Usar el procedimiento pivote(t,i,j,l) El pivote queda en la posición l Si l = k, hemos acertado Si l > k, hay que buscar el elemento en las casillas de i a l-1 Si l < k, hay que buscar el elemento en las casillas de l+1 a k

3.3. Problema de la selección Función seleccion(t: matriz [1..n] de entero, k: entero): entero i = 1; j = n pivote(t,i,j,l) mientras (k l) hacer si (l > k) entonces j = l-1 sino i = l+1 pivote(t,i,j,l) devolver T[l] 3.3. Problema de la selección Complejidad Depende de los datos de entrada, porque se basa en el procedimiento pivote Caso mejor Acertamos a la primera t(n) θ(n)

3.3. Problema de la selección Complejidad Caso peor Por ejemplo, k = 1 y T = [9, 1, 2, 3, 4, 5, 6, 7, 8] t(n) θ(n 2 ) En media Se hace un número logarítmico de llamadas a pivote(), cada una con coste lineal t(n) θ(n.log n) 3.4. Multiplicación de matrices de Strassen Problema Multiplicar dos matrices de nxn componentes Solución elemental La que viene dada por la definición clásica

3.4. Multiplicación de matrices de Strassen Función multiplicar(a,b: matriz [1..n][1..n] de entero): matriz [1..n][1..n] de entero R : matriz [1..n][1..n] de entero para i = 1 hasta n hacer para j = 1 hasta n hacer R[i][j] = 0 devolver R para k = 1 hasta n hacer R[i][j] = R[i][j] + A[i][k]. B[k][j] 3.4. Multiplicación de matrices de Strassen Complejidad t(n) θ(n 3 ) Enfoque Divide y vencerás Descomponer las matrices en menores de tamaño inferior

3.4. Multiplicación de matrices de Strassen Descomposición A A = A 11 21 A A 12 22 B B = B 11 21 B B 12 22 R R = R 11 21 R R 12 22 R 11 = A 11 xb 11 + A 12 xb 21 R 12 = A 11 xb 12 + A 12 xb 22 R 21 = A 21 xb 11 + A 22 xb 21 R 22 = A 21 xb 12 + A 22 xb 22 3.4. Multiplicación de matrices de Strassen Complejidad t(n) = 1 si n 2 t(n) = 8t(n/2) + n 2 si n > 2, n = 2 i => t(n) θ(n 3 )

3.4. Multiplicación de matrices de Strassen Reducción del número de multiplicaciones (Strassen, 1970) P = (A 11 +A 22 ) (B 11 +B 22 ) Q = (A 21 +A 22 )B 11 R = A 21 (B 12 -B 22 ) S = A 22 (B 21 -B 11 ) T = (A 11 +A 12 )B 22 U = (A 21 -A 11 ) (B 11 +B 12 ) V = (A 12 -A 22 ) (B 21 +B 22 ) => R 11 = P+S-T+V R 12 = R +T R 21 = Q+S R 22 = P+R -Q+U 3.4. Multiplicación de matrices de Strassen Complejidad t(n) = 1 si n 2 t(n) = 7t(n/2) + n 2 si n > 2, n = 2 i => t(n) θ(n log2 7 ) = θ(n 2,81 )