Algoritmos y Estructura de Datos III Facultad de Ciencias Exactas y Naturales, Universidad de Buenos Aires 27 de Marzo de 2013
2.8 - Euclides 2.8. a. Escribir el algoritmo de Euclides para calcular el máximo común divisor entre 2 números b y c en forma recursiva y no recursiva. Mostrar que su complejidad es O(min{b,c}). Puede construir un ejemplo (un peor caso) donde esta complejidad efectivamente se alcance? Puede hacerlo para b y c tan grandes como se desee?
Euclides - Repaso Regla de euclides Si b,c enteros positivos y b c luego mcd(b, c) = mcd(c, b mod c).
Euclides - Repaso Regla de euclides Si b,c enteros positivos y b c luego mcd(b, c) = mcd(c, b mod c). Prueba Basta mostrar que mcd(b, c) = mcd(c, b c).
Euclides - Repaso Regla de euclides Si b,c enteros positivos y b c luego mcd(b, c) = mcd(c, b mod c). Prueba Basta mostrar que mcd(b, c) = mcd(c, b c). Si g b y g c g b c: mcd(b, c) mcd(c, b c).
Euclides - Repaso Regla de euclides Si b,c enteros positivos y b c luego mcd(b, c) = mcd(c, b mod c). Prueba Basta mostrar que mcd(b, c) = mcd(c, b c). Si g b y g c g b c: mcd(b, c) mcd(c, b c). b = g k 1, c = g k 2, b c = g k 1 g k 2 = g (k 1 k 2 )
Euclides - Repaso Regla de euclides Si b,c enteros positivos y b c luego mcd(b, c) = mcd(c, b mod c). Prueba Basta mostrar que mcd(b, c) = mcd(c, b c). Si g b y g c g b c: mcd(b, c) mcd(c, b c). b = g k 1, c = g k 2, b c = g k 1 g k 2 = g (k 1 k 2 ) : Busco el mayor g posible. Sirve para (b, c) sirve para (c, b c), pero talvez haya g > g que divida (c, b c).
Euclides - Repaso Regla de euclides Si b,c enteros positivos y b c luego mcd(b, c) = mcd(c, b mod c). Prueba Basta mostrar que mcd(b, c) = mcd(c, b c). Si g b y g c g b c: mcd(b, c) mcd(c, b c). b = g k 1, c = g k 2, b c = g k 1 g k 2 = g (k 1 k 2 ) : Busco el mayor g posible. Sirve para (b, c) sirve para (c, b c), pero talvez haya g > g que divida (c, b c). Si g b c y g c g b : mcd(b, c) mcd(b c, c).
2.8. a. Algoritmo recursivo Algorithm 1: Euclides-Recursivo Data: b, c Result: mcd(b, c) if c = 0 then return b else return Euclides-Recursivo(c, b mod c)
2.8. a. Algoritmo no recursivo Algorithm 2: Euclides-Iterativo Data: b, c Result: mcd(b, c) while c 0 do t := c c := b mod t b := t return b
2.8. a. Complejidad Mostrar que la complejidad temporal está acotada por: O(min{b, c}).
2.8. a. Complejidad Mostrar que la complejidad temporal está acotada por: O(min{b, c}). Qué número es menor luego de la primer iteración?
2.8. a. Complejidad Mostrar que la complejidad temporal está acotada por: O(min{b, c}). Qué número es menor luego de la primer iteración? (b, c) (c, b mod c)
2.8. a. Complejidad Mostrar que la complejidad temporal está acotada por: O(min{b, c}). Qué número es menor luego de la primer iteración? (b, c) (c, b mod c) Comparar c vs b mod c:
2.8. a. Complejidad Mostrar que la complejidad temporal está acotada por: O(min{b, c}). Qué número es menor luego de la primer iteración? (b, c) (c, b mod c) Comparar c vs b mod c: b < c c c b > c b b b mod c c c b mod c
2.8. a. Complejidad Mostrar que la complejidad temporal está acotada por: O(min{b, c}). Qué número es menor luego de la primer iteración? (b, c) (c, b mod c) Comparar c vs b mod c: b < c c c b > c b b b mod c c c b mod c si b = c?
2.8. a. Complejidad Luego de la primer iteración: c := b mod c min{b, c}
2.8. a. Complejidad Luego de la primer iteración: c := b mod c min{b, c} En cada iteración c disminuye en al menos una unidad
2.8. a. Complejidad Luego de la primer iteración: c := b mod c min{b, c} En cada iteración c disminuye en al menos una unidad El algoritmo termina cuando c = 0
2.8. a. Complejidad Luego de la primer iteración: c := b mod c min{b, c} En cada iteración c disminuye en al menos una unidad El algoritmo termina cuando c = 0 Luego de k + 1 iteraciones, el algoritmo termina, donde k = min{b, c}
2.8. a. Complejidad Luego de la primer iteración: c := b mod c min{b, c} En cada iteración c disminuye en al menos una unidad El algoritmo termina cuando c = 0 Luego de k + 1 iteraciones, el algoritmo termina, donde k = min{b, c} Ejemplo de un peor caso? Familia de peores casos? Ideas?
2.8. b. Analizar el siguiente algoritmo para determinar el máximo común divisor entre dos números b y c, y mostrar que su complejidad también es O(min {b,c}). 1. Poner g = min { b,c } 2. mientras g > 1 3. si b/g y c/g son enteros, informar mcd = g y parar. 4. poner g = g - 1 5. informar mcd = 1 y parar
2.8.b - Euclides Es correcto?
2.8.b - Euclides Es correcto? Busca ordenadamente el primer g que cumpla la propiedad de ser mcd.
2.8.b - Euclides Es correcto? Busca ordenadamente el primer g que cumpla la propiedad de ser mcd. La iteracion recorre: g = min {b,c}.. 1
2.8.b - Euclides Es correcto? Busca ordenadamente el primer g que cumpla la propiedad de ser mcd. La iteracion recorre: g = min {b,c}.. 1 Dudas?
2.8. c. Las complejidades calculadas para los algoritmos de las partes a. y b. son iguales. Cuál de los dos algoritmos elegiría? Justificar y comentar.
2.8.c - Elección de algoritmo Cual prefieren? Por qué?
2.8.c - Elección de algoritmo Cual prefieren? Por qué? Factores a tomar en cuenta para decidir qué algoritmo utilizar:
2.8.c - Elección de algoritmo Cual prefieren? Por qué? Factores a tomar en cuenta para decidir qué algoritmo utilizar: 1. Teoría: Correctitud, Complejidad temporal, complejidad espacial, etc.
2.8.c - Elección de algoritmo Cual prefieren? Por qué? Factores a tomar en cuenta para decidir qué algoritmo utilizar: 1. Teoría: Correctitud, Complejidad temporal, complejidad espacial, etc. 2. Practica: Resultados experimentales, dificultad de la implementación, propenso a errores, etc.
2.8.c - Elección de algoritmo Cual prefieren? Por qué? Factores a tomar en cuenta para decidir qué algoritmo utilizar: 1. Teoría: Correctitud, Complejidad temporal, complejidad espacial, etc. 2. Practica: Resultados experimentales, dificultad de la implementación, propenso a errores, etc. Cuando usamos O() para la complejidad temporal damos una garantía de peor caso, pero es una cota superior. Esa cota no es necesariamente ajustada.
2.8.c - Elección de algoritmo Cual prefieren? Por qué? Factores a tomar en cuenta para decidir qué algoritmo utilizar: 1. Teoría: Correctitud, Complejidad temporal, complejidad espacial, etc. 2. Practica: Resultados experimentales, dificultad de la implementación, propenso a errores, etc. Cuando usamos O() para la complejidad temporal damos una garantía de peor caso, pero es una cota superior. Esa cota no es necesariamente ajustada. En la vida real, lo ideal es mezclar resultados teoricos y practicos para sacar conclusiones.
2.8.c - Elección de algoritmo Cual prefieren? Por qué? Factores a tomar en cuenta para decidir qué algoritmo utilizar: 1. Teoría: Correctitud, Complejidad temporal, complejidad espacial, etc. 2. Practica: Resultados experimentales, dificultad de la implementación, propenso a errores, etc. Cuando usamos O() para la complejidad temporal damos una garantía de peor caso, pero es una cota superior. Esa cota no es necesariamente ajustada. En la vida real, lo ideal es mezclar resultados teoricos y practicos para sacar conclusiones. En este caso, es importante notar la diferencia entre las cotas superiores encontradas para medir la complejidad temporal, una es ajustada y la otra no.
2.8. d. Probar que se puede mejorar la complejidad calculada en a. demostrando que el algoritmo de Euclides es en realidad O(log 2 (min{b, c})).
2.8.d - Mejorando la complejidad temporal Qué tan rápido decrecen (b, c)?
2.8.d - Mejorando la complejidad temporal Qué tan rápido decrecen (b, c)? En una iteración: (b, c) (c, b mod c)
2.8.d - Mejorando la complejidad temporal Qué tan rápido decrecen (b, c)? En una iteración: (b, c) (c, b mod c) Hacer ejemplos y pensar hasta que se nos ocurra algo...
2.8.d - Mejorando la complejidad temporal Qué tan rápido decrecen (b, c)? En una iteración: (b, c) (c, b mod c) Hacer ejemplos y pensar hasta que se nos ocurra algo...
2.8.d - Mejorando la complejidad temporal Lema Si b c b mod c < b 2.
2.8.d - Mejorando la complejidad temporal Lema Si b c b mod c < b 2, Caso 1: c b/2 c b/2 c b mod c < c b/2 b/2 b b/2 c c b mod c
2.8.d - Mejorando la complejidad temporal Lema Si b c b mod c < b 2 Caso 2: c > b/2 c > b/2 b mod c = b - c < b/2 c b/2 b c b/2 b mod c b
2.8.d - Mejorando la complejidad temporal Cada dos iteraciones, b y c disminuyen a la mitad (o más).
2.8.d - Mejorando la complejidad temporal Cada dos iteraciones, b y c disminuyen a la mitad (o más). Luego de la primer iteración: b 1 c 1 y b 1 min{b 0, c 0 }
2.8.d - Mejorando la complejidad temporal Cada dos iteraciones, b y c disminuyen a la mitad (o más). Luego de la primer iteración: b 1 c 1 y b 1 min{b 0, c 0 } Concluyo que una cota superior de la complejidad temporal es O(log 2 (min{b, c})
2.8.d - Mejorando la complejidad temporal Cada dos iteraciones, b y c disminuyen a la mitad (o más). Luego de la primer iteración: b 1 c 1 y b 1 min{b 0, c 0 } Concluyo que una cota superior de la complejidad temporal es O(log 2 (min{b, c}) Se puede mejorar?
Fin DUDAS