La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Diseño y análisis de algoritmos

Presentaciones similares


Presentación del tema: "Diseño y análisis de algoritmos"— Transcripción de la presentación:

1 Diseño y análisis de algoritmos
Técnica de diseño “Dividir y Conquistar”

2 Temario Técnica de diseño “Dividir y Conquistar” Introducción
Esquema genérico Aplicaciones Multiplicación de enteros grandes

3 Técnica de diseño “dividir y conquistar”
Introducción Idea: es una técnica de diseño de algoritmos que consiste en Descomponer la instancia del problema a resolver en un cierto número de subinstancias más pequeños del MISMO PROBLEMA; Resolver independientemente cada una de estas subinstancias; Combinar las soluciones obtenidas para construir la solución de la instancia del problema original Generalmente resulta un algoritmo más eficiente que el original Aplicaciones, entre otras: Búsqueda binaria Merge sort (ya pasado) Clasificación de Hoare (quicksort) Selección y búsqueda de la mediana Aplicaciones, entre otras: Multiplicación de enteros grandes Multiplicación de matrices Introducción a la criptografía Itinerarios (ej:calendario campeonato)

4 Técnica de diseño “dividir y conquistar”
Esquema genérico function dividir_y_conquistar(X: tx) devuelve ty VAR X1, X Xk :tx; /*var tipo tx*/ Y1, Y Yk :ty; If X es suficientemente simple o pequeño then return( algoritmoBasico(X)) else begin descomponer X en X1, X Xk; for (i=1; i < k; i++) do Yi = dividir_y_conquistar( Xi); rocomponer los Yi para obtener una solución Y a X return(Y) end End;

5 Técnica de diseño “dividir y conquistar”
Esquema genérico Es importante , determinar para cada problema: Cuáles son las subinstancias y cómo se encuentran. Es decir, la descomposición. Cómo resolver el problema en las subinstancias. Es decir, el algoritmo Básico Cómo combinar las soluciones parciales Del esquema básico se puede apreciar que el diseño es de una función recursiva y su criterio de parada sucede cuando una subinstancia llega a tener un tamaño suficientemente pequeño para ser resuelta inmediatamente. Este tamaño se puede denominar umbral

6 Técnica de diseño “dividir y conquistar”
Esquema genérico, análisis del tiempo de ejecución El tiempo de ejecución está dado por la recurrencia: Si n es suficientemente pequeño o Donde ,b es una constate tal que n/b se aproxima al tamaño de las subinstancias f(n) es el tiempo del algoritmoBásico(), y g(n) es el tiempo de la partición y la Recombinación. Para que la estrategia sea eficiente las subinstancias deben ser todas de aproximadamente el mismo tamaño. Además se debe estudiar cuidadosamente cuales son los mejores umbrales. Para calcular la complejidad de estos casos se puede usar el teorema “maestro” de las recurrencias:

7 Técnica de diseño “dividir y conquistar”
Esquema genérico, análisis del tiempo de ejecución Teorema: sean a>=1, b > 1 constantes, f(n) una función y T(n) una recurrencia definida sobre sobre los los enteros no negativos de la forma donde n/b puede considerarse una división entera. Entonces valen: Si para algún entonces Si entonces Si para algún ,y satisface para alguna positiva, entonces Ejemplos: Si entonces a=9, b=3, se aplica el caso 1 con y Si entonces a=1, b=3/2, se aplica el caso 2 y Si entonces a = 3, b= 4, y ,con c=3/4, por lo que se aplica el caso 3 y

8 Técnica de diseño “dividir y conquistar”
Esquema genérico, análisis del tiempo de ejecución Determinación del umbral: Aunque la determinación del umbral no afecta el orden de complejidad de los algoritmos DyC, si afecta el tiempo efectivo de ejecución. Ejemplo: Entonces el algoritmo básico es de y seguún teorema maestro, regla 1, el orden de DyC es sin embargo, cambiando el umbral, se podría obtener los siguientes experimientos de tiempo medidos en microsegundos : n T DyC con T DyC con Algoritmo básico 5000 32000 42 seg 15 min 6 seg 2 min 25 seg 17 min

9 Técnica de diseño “dividir y conquistar”
Esquema genérico, análisis del tiempo de ejecución Determinación del umbral: Es muy difícil, o a veces imposible, encontrar teóricamente un umbral óptimo, pues puede variar con el valor de n para el mismo problema. Puede pasar que el umbral óptimo puede cambiar de instancia en instancia y que dependa de de cada implementación en particular. Otra opción es usar un método empírico para aproximar un buen umbral, pero es poco práctico, pues se requiere aplicar el algoritmo varias veces y a una gran cantidad de instancias. Una opción mejor es un camino híbrido: se calcula la función teórica de la complejidad del algoritmo, dando valores a las constantes de acuerdo con pruebas empíricas. Luego se toma como un valor tal que tome aproximadamente el mismo tiempo el algoritmo básico y el DyC. Correctitud: Esta se demuestra a través de comprobar la correctitud el algoritmo básico. Luego se debe aplicar inducción sobre el tamaño de la instancia.

10 Técnica de diseño “dividir y conquistar”
Multiplicación de enteros grandes Problema: Supongamos que tenemos que multiplicar dos enteros a y b de n y m dígitos , cantidades que no son posibles de representar directamente en ele hardware de la máquina.(recordar que si pueden operarse directamente por la máquina se considera cun orden constante) Es fácil implementar una estructura de datos para estos enteros grandes que soporte la suma , resta y productos y divisiones por potencias de la base en tiempo Si se quiere mutiplicar por cualquier número, entonces habrá que implementar un algoritmo tradicional, que tiene una complejidad La idea es aplicar la técnica dividir y conquistar para tratar de mejorar el tiempo. Supongamos por un momento que m=n.

11 Técnica de diseño “dividir y conquistar”
Multiplicación de enteros grandes Problema: Aplicando DyC una vez , y usando base 10 se tiene: a x y b w z Esto es: Si se extiende el método aplicando DyC recursivamente se obtiene la recurrencia:

12 Técnica de diseño “dividir y conquistar”
Multiplicación de enteros grandes Se puede calcular que : , puesto que se requieren 4 llamadas recursivas con productos con dígitos más pequeños, por lo que el orden es similar a los algoritmos tradicionales. Se puede mejorar tomando: Con lo que entonces: y Se tienen entonces dos productos de dígitos, y r un producto de a lo sumo dígitos, más sumas restas y productos por la potencia de la base (lineales).

13 Técnica de diseño “dividir y conquistar”
Multiplicación de enteros grandes Si el tiempo del algoritmo base es : , y el de sobrecarga es g(n), entonces aplicando DyC una sóla vez se obtiene: que comparado con es una mejora del 25% en la constante del término principal, paero aún así se mantiene en un orden Para obtener una mejora significativa, es necesario aplicar reiteradamente DyC a los productos más pequeños. La rrecurrencia generada por el algoritmo es :

14 Técnica de diseño “dividir y conquistar”
Multiplicación de enteros grandes Se puede calcular que : , puesto que se requieren 3 llamadas recursivas con productos con dígitos más pequeños, por lo que el orden es mejor que a los algoritmos tradicionales. Falta calcular con un tamaño “suficientemente pequeño” para que convenga aplicar el algoritmo básico. Aquí es lógico usar un tamaño que corresponda con el de la representación del hardware, con lo que el algoritmo básico será de un oren menor al de DyC . A continuación el algoritmo en pseudocódigo.

15 Técnica de diseño “dividir y conquistar”
Multiplicación de enteros grandes Truco: calcular xw, xz+yw , yz haciendo menos de cuatro multiplicaciones. Por álgebra: r = (x + y) (w + z) = xw + (xz+yw)+ yz enterogrande function mult2(enterogrande u,v) { int n, s; /*var enteras*/ enterogrande : w, x, y , z, r, p , q; n = máximo(tam(u),tam(v)); If n “es suficientemente pequeño” { return( u*v) /*multiplicación clásica*/ } else { s = n DIV 2; x = u DIV 10 ; y = u % 10 ; w = v DIV 10 ; z = v % 10 ; r = mult2(x+y,w+z); p = mult2(x,w); q = mult2(y,z); return(p*10 ) + (r – p – q )* q s s s s s 2s


Descargar ppt "Diseño y análisis de algoritmos"

Presentaciones similares


Anuncios Google