Title: CC30A Algoritmos y Estructuras de Datos
1CC30A Algoritmos y Estructuras de Datos
Universidad de Chile Facultad de Ciencias Físicas
y Matemáticas Escuela de Ingeniería y Ciencias
- Dividir para reinar
- Tabulación
2Dividir para reinarMultiplicación de dos
polinomios
- Problema multiplicar dos polinomios de grado
n-1. - A(x)a0a1xa2x2an-1xn-1
- B(x)b0b1xb2x2bn-1xn-1
- CA(x)B(x).
3Dividir para reinarMultiplicación de dos
polinomios
- Solución trivial O(n2)
- float cnew float2n-1
- // inicializar ck en 0
- for (i0 iltn i)
- for (j0 jltn j)
- cijaibj
4Dividir para reinarMultiplicación de dos
polinomios
- Algoritmo más eficiente separar cada polinomio
en 2 partes. - Ejemplo
5Dividir para reinarMultiplicación de dos
polinomios
- En general
- El grado de cada polinomio de la suma es (n/2)-1.
6Dividir para reinarMultiplicación de dos
polinomios
- Por lo tanto
- Esto se puede implementar con 4 multiplicaciones
de polinomios de tamaño n/2, más kn sumas (para
algún k).
7Dividir para reinarMultiplicación de dos
polinomios
- El número total de operaciones T(n) se puede
escribir como - Qué complejidad temporal tiene el algoritmo?
8Dividir para reinarMultiplicación de dos
polinomios
- Se resolverá la ecuación
- Desenrollando la ecuación
9Dividir para reinarMultiplicación de dos
polinomios
- En general
- Si pgtq (nuestro caso)
10Dividir para reinarMultiplicación de dos
polinomios
- Escoger j tal que qjn (o sea, jlogqn)
- Pero
11Dividir para reinarMultiplicación de dos
polinomios
- Por lo tanto, el algoritmo demora
- Aplicando el resultado a nuestra ecuación, donde
p4 y q2 - El resultado no es muy interesante
12Dividir para reinarMultiplicación de dos
polinomios
- PERO si se calcula
- Entonces
- Requiere 3 multiplicaciones recursivas.
13Dividir para reinarMultiplicación de dos
polinomios
- Por lo tanto
- Ejercicio demostrar T(n) en los casos
- pltq O(n)
- pq (n log n)
14Recursividad y tabulación
- No siempre la recursividad es eficiente.
- Ejemplo cálculo de números de Fibonacci.
15Recursividad y tabulación
16Recursividad y tabulación
- Solución recursiva
- int F(int n)
-
- if (nlt1)
- return n
- else
- return F(n-1)F(n-2)
17Recursividad y tabulación
- Esto resulta muy ineficiente. Si T(n) representa
el número de sumas ejecutadas para calcular fn,
se tiene - T(0)0
- T(1)0
- T(n)1T(n-1)T(n-2)
18Recursividad y tabulación
- Tabla de valores para T(n)
- T(n)fn-1? Si. (Ejercicio demostrarlo).
19Recursividad y tabulación
- Luego, el tiempo crece de manera exponencial (muy
lento). - El problema es que se está recalculando una y
otra vez los mismos valores (ver dibujo en
pizarra). - Una forma de evitar esto es anotar los valores
calculados en un arreglo.
20Recursividad y tabulación
- El arreglo debe llenarse de manera ordenada
- int F(int n)
-
- int fibn1
- fib00
- fib11
- for (i2 iltn i)
- fibifibi-1fibi-2
-
21Recursividad y tabulación
- Tiempo del nuevo algoritmo O(n).
- Esta idea se llama programación dinámica cuando
se usa para resolver problemas de optimización. - Es posible calcular fn más rápido que O(n)?
Respuesta Si.
22Recursividad y tabulación
- Se tiene que
- Se define una función auxiliar g tal que
23Recursividad y tabulación
- Con esto se plantea el siguiente sistema de
ecuaciones
24Recursividad y tabulación
- An-1 se puede calcular por el método eficiente gt
Tiempo O(log n).