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

´ Divide y Venceras ´ Dinamica ´ Programacion Algoritmos ˜ de algoritmos por induccion ´ Diseno Alberto Valderruten ´ Universidade da Coruna ˜ Dept.

0 downloads 21 Views 263KB Size

Story Transcript

´ Divide y Venceras ´ Dinamica ´ Programacion

Algoritmos ˜ de algoritmos por induccion ´ Diseno

Alberto Valderruten ´ Universidade da Coruna ˜ Dept. de Computacion,

[email protected]

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Contenido

1

´ Divide y Venceras

2

´ Dinamica ´ Programacion

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´Indice

1

´ Divide y Venceras

2

´ Dinamica ´ Programacion

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´ (1) Divide y Venceras Descomponer el caso a resolver en subcasos del mismo problema, resolverlos, independientemente entre s´ı (recursivamente), y combinar las soluciones de los subcasos ´ del caso original. para obtener la solucion ´ ´ Ejemplos vistos: suma de la subsecuencia maxima (funcion SSM recursiva), mergesort, quicksort, busqueda binaria. ´ ´ Esquema para la tecnica: considerar ´ - un problema (ejemplo: ordenacion) - un algoritmo ad-hoc (capaz de resolver ese problema), sencillo ˜ del problema (ej: Insercion) ´ y eficiente para casos pequenos ´ Divide y Venceras ´ → Esquema: funcion Ejercicio: contrastarla con los ejemplos vistos Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´ Divide y Venceras ´ funcion

funci´ on Divide y Vencer´ as (x): soluci´ on si x es suficientemente peque˜ no entonces devolver ad-hoc(x) sino descomponer x en casos m´ as peque˜ nos x1, x2, ..., xa; para i := 1 hasta a hacer yi := Divide y Vencer´ as (xi) fin para; combinar los yi para obtener una soluci´ on y de x; devolver y fin si fin funci´ on

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´ (2) Divide y Venceras ˜ independiente Caracter´ısticas de a (no de subcasos): pequeno, de la entrada ´ Caso particular: a = 1 ⇒ algoritmo de reduccion → el paso de recursivo a iterativo supondra´ un ahorro ´ Ω(n)) en tiempo (constante) y en espacio (pila de ejecucion, Ejemplo: busqueda binaria ´ Principales problemas: ´ y combinacion ´ ¿posibles? ¿eficientes? - descomposicion ˜ n/b, - subcasos en lo posible del mismo tamano: donde b es una constante distinta, a priori, de a - ¿umbral a partir del cual hay que utilizar el algoritmo ad-hoc? ´ Analisis: ´ de recurrencia Reglas ⇒ relacion ´ → ¿cumple condiciones del teorema Divide y Venceras? Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´Indice

1

´ Divide y Venceras

2

´ Dinamica ´ Programacion

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´ Dinamica ´ Programacion (1)

´ → riesgo de llegar a tener Divide y Venceras ´ un gran numero de subcasos identicos ≡ ineficiencia! ´ ´ de Fibonacci [1202] Ejemplo: La sucesion - Leonardo de Pisa [1170-1240] - se define  inductivamente del modo siguiente:  fib(0) = 0 fib(1) = 1  fib(n) = fib(n − 1) + fib(n − 2) si n ≥ 2 ´ aurea: ´ ↔ seccion s1 ≥ s2 , s = s1 + s2 ´ s1 : segmento aureo de s ≡ s12 = s.s2 ´ ⇒ s2 : segmento aureo de s1 ≡ s22 = (s1 − s2 )s1 → ley de armon´ıa (arquitectura, arte)...

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Fibonacci 1

Algoritmo Fibonacci 1: funci´ on fib1(n) si n < 2 entonces devolver n sino devolver fib1(n-1) + fib1(n-2) fin si fin funci´ on



T (n) = Θ(Φn ) , donde Φ = (1 + 5)/2 ´ de recurrencias) (Cf. resolucion fib1(5) produce 3 llamadas a fib1(0), 5 llamadas a fib1(1),... en total, 15 llamadas

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´ Dinamica ´ Programacion (2) ´ vez, ´ Dinamica: ´ Programacion resolver cada subcaso una sola guardando las soluciones en una tabla de resultados, ´ buscada. que se va completando hasta alcanzar la solucion ´ ⇒ Tecnica ascendente, ´ opuesta a la descendente de Divide y Venceras Ejemplo: Algoritmo Fibonacci 2 funci´ on fib2(n) i := 1; j := 0; para k := 1 hasta n hacer j := i+j; i := j-i fin para; devolver j fin funci´ on

T (n) = Θ(n) y espacio en Θ(1). Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Fibonacci 3 Algoritmo Fibonacci 3: T (n) = O (logn) funci´ on fib3(n) i := 1; j := 0; k := 0; h := 1; mientras n > 0 hacer si n es impar entonces t := j*h; j := i*h + j*k + t; i := i*k + t fin si; t := hˆ2; h := 2*k*h + t; k := kˆ2 + t; n := n div 2 fin mientras; devolver j fin funci´ on

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Coeficientes binomiales (1)



n k

 =

       

n−1 k −1

1  si k = 0 ∨ k = n n−1 + si 0 < k < n k

0

sino

Ejemplo: Teorema  de Newton   (1 + x )n = 1 +

n 1

x+

n 2

x2 + · · · +

 Problema: Dados 0 ≤ k ≤ n → ¿



n k

n

n − 1



x n−1 + x n

?

funci´ on C(n, k): valor si k = 0 ´ o k = n entonces devolver 1 sino devolver C(n-1, k-1) + C(n-1, k) fin si fin funci´ on

´ ´ muchos calculos Divide y Venceras: se repiten   n ≡ suma de 1’s (como en fib1) → Ω k Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Coeficientes binomiales (2) ´ Dinamica: ´ Programacion ´ → Tabla de resultados intermedios: triangulo de Pascal 0 1 2 ...

0 1 1 1

1

2

1 2

1

k −1

...

 n−1

n−1 k −1

n

k





n−1  k  n k



´ T (n) = Θ(nk ) y la complejidad espacial tambien ¿Mejora? La complejidad espacial puede ser Θ(k ) ´ l´ınea del triangulo ´ ↔ manejar una sola de Pascal ´ Ejercicio: escribir el pseudocodigo Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Devolver el cambio (1) Problema: el algoritmo voraz es eficiente pero no “funciona” siempre: M = {1, 4, 6}, n = 8 ⇒ ¿S = {4, 4}? Dado M = {v1 , v2 , . . . , vm }, vi > 0: denominaciones de monedas Objetivo: pagar exactamente n unidades de valor, con |S | m´ınimo ´ Hipotesis: ∃ suministro ilimitado de monedas ´ Dinamica ´ Programacion ↔ tabla c [1..m, 0..n] c [i , j ] = no m´ınimo de monedas para pagar j (0 ≤ j ≤ n) ´ v1 ..vi (1 ≤ i ≤ m). utilizando monedas de denominacion |S | = c [m, n] ´ de la tabla: Construccion c [ i , 0] = 0 c [i , j ]= ´ de vi ↔ i > 1 c [ i − 1, j ] : no utilizar una moneda mas min ´ de vi 1 + c [i , j − vi ] : utilizar una moneda mas ↔ j ≥ vi ´ Caso particular: i = 1 ∧ j < v1 ⇒ c [i , j ] = +∞ ≡ no hay solucion Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Devolver el cambio (2)

funci´ on monedas (n): n´ umero de monedas const v[1..m]=[1,4,6] {denominaciones de las monedas} {se construye una tabla c[1..m, 0..n]} para i := 1 hasta m hacer c [i,0] := 0; para i := 1 hasta m hacer para j := 1 hasta n hacer si i = 1 y j < v[i] entonces c[1,j] := infinito sino si i = 1 entonces c[1,j] := 1 + c[1, j-v[1] ] sino si j < v[i] entonces c[i,j] := c[i-1,j] sino c[i,j] := min ( c[i-1, j], 1 + c[i, j-v[i] ] ) fin si fin para fin para; devolver c[m,n] fin funci´ on

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

Devolver el cambio (3) Ejemplo: M = {1, 4, 6} ¿c [3, 8]? n

0

1

2

3

4

5

6

7

8

{1} {1, 4} {1, 4, 6}

0 0 0

1 1 1

2 2 2

3 3 3

4 1 1

5 2 2

6 3 1

7 4 2

8 2 2

´ Analisis: T (n) = Θ(mn) Problema: ¿Conjunto de monedas? ⇒ Algoritmo voraz sobre c: camino c [m, n] → c [0, 0] ´ vi ” m “pasos” hacia arriba ≡ “no utilizar mas ´ +c [m, n] “saltos” hacia la izquierda ≡ “utilizar una vi mas” ´ de la tabla ⇒ Θ(m + c [m, n]) adicional a la construccion

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

El problema de la mochila II (1)

´ II: los objetos no se pueden fraccionar Version 0 ≡ dejar ≡ xi ∈ 1 ≡ tomar ¿Que´ pasa con el algoritmo voraz? Ejemplo: n = 3, W = 9 Objetos 1 2 3 vi 9 7 5 wi 6 5 4 vi /wi 1,5 1,4 1,25 Objetivo (∑ni=1 xi vi ) xi (voraz) 1 0 0 9 ´ xi (optimo) 0 1 1 12 ⇒ ¡Ha dejado de funcionar!

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

El problema de la mochila II (2)

´ Dinamica ´ Programacion ↔ tabla v [1..n, 0..W ] ´ v [i , j ] = valor de carga maxima para capacidad j (0 ≤ j ≤ W ) considerando los objetos 1..i (1 ≤ i ≤ n). ´ de la tabla: Construccion v [ i − 1, j ] v [i , j ] = max v [i − 1, j − wi ] + vi

˜ : no anadir el objeto i ˜ : anadir el objeto i

´ a diferencia del caso de las monedas, Observacion: ´ se puede incluir “una vez” en la carga de la cada objeto solo mochila. Ejercicio: ¿algoritmo?

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

El problema de la mochila II (3) Ejemplo:

{1} {1, 2} {1, 2, 3}

vi

wi

0

1

2

3

4

5

6

7

8

9

9 7 5

6 5 4

0 0 0

0 0 0

0 0 0

0 0 0

0 0 5

0 7 7

9 9 9

9 9 9

9 9 9

9 9 12

´ Analisis: T (n) = Θ(nW ) ´ de la carga? Problema: ¿Composicion ⇒ Recorrido sobre v : camino v [n, W ] → v [0, 0] ´ maximo n “pasos” hacia arriba ≡ “no incluir el objeto i” ´ + maximo W “saltos” hacia arriba y a la izquierda ≡ “incluir el objeto i” ´ de la tabla ⇒ Θ(n + W ) : trabajo adicional a la construccion

Alberto Valderruten

Algoritmos

´ Divide y Venceras ´ Dinamica ´ Programacion

´ Dinamica ´ ´ Programacion (conclusion)

Principio de optimalidad: ´ Dinamica ´ La Programacion se utiliza ´ para resolver problemas de optimizacion que satisfacen el principio de optimalidad: ´ “En una secuencia optima de decisiones ´ optima” ´ toda subsecuencia ha de ser tambien ¡No siempre es aplicable! ´ largo entre dos nodos Ejemplo: hallar el camino simple mas

Alberto Valderruten

Algoritmos

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.