tema 1: divide y vencerás
Transcripción
tema 1: divide y vencerás
TEMA 1: DIVIDE Y VENCERÁS l OBJETIVOS: n Estudio de la estrategia de diseño de algoritmos (recursivos) Divide y Vencerás n Estudio de los algoritmos de Ordenación Rápida: MergeSort y QuickSort n Estudio de otros algoritmos clásicos. 1 ÍNDICE l ÍNDICE: n La aproximación Divide y Vencerás. n Análisis de la corrección y la eficiencia de los algoritmos DyV n Problemas: Ordenación Rápida, Selección, Multiplicación de Matrices, otros. 2 BIBLIOGRAFÍA l l l G. Brassard, P. Bratley. Fundamentos de Algoritmia. Prentice Hall, 1997. Capítulo 4. T.H. Cormen, C.E. Leiserson, R.L. Rivest Introduction to Algorithms. MIT Press, 1990. Capítulos 1, 8 y 10. M.A. Weiss Estructuras de datos y Algoritmos. Addison-Wesley, 1995. Capítulo 10. 3 1. LA APROXIMACIÓN DyV DIVIDIR el problema original en varios subproblemas que se dividen la talla de forma equilibrada. l VENCER (resolver) los subproblemas de forma recursiva. Si éstos son de un tamaño suficientemente pequeño, resolverlos de forma directa. l COMBINAR las soluciones para obtener la solución del problema original. l 4 ALGORITMO DE ORDENACIÓN POR FUSIÓN (MergeSort) n DIVIDE la secuencia de n elementos a ordenar en DOS subsecuencias de n/2 elementos cada una. n ORDENA las dos subsecuencias por fusión. Si la secuencia tiene un sólo elemento no hace nada. n MEZCLA las dos subsecuencias YA ordenadas para producir la secuencia completa también ordenada. 5 Ejemplo: Mergesort Acción MergeSort (A,p,r) Si p<r entonces q:=[(p+r)/2]; MergeSort(A,p,q); MergeSort(A,q+1,r); Merge(A,p,q,r); Fsi Facción DIVIDE VENCE COMBINA 6 Ejemplo: MergeSort l La acción de combinar Merge: {p<=r Ordenada(A,p,q) Ordenada(A,q+1,r)} Merge(A,p,q,r); {Ordenada(A,p,r)} 7 Ejemplo: MergeSort La acción de combinar Merge: {p<=r Ordenada(A,p,q) Ordenada(A,q+1,r)} Merge(var A:secuencia;p,q,r:nat); var B: secuencia; i,j,k:nat; i:=p; j:=q+1; k:=p; mientras (i<=q) and (j<=r) hacer si A[i]<A[j] entonces B[k]:=A[i]; i:=i+1; sino B[k]:=A[j]; j:=j+1; fsi; k:=k+1; fmientras; mientras (i<=q) hacer B[k]:=A[i]; i:=i+1; k:=k+1; fmientras; mientras (j<=r) hacer B[k]:=A[j]; j:=j+1; k:=k+1; fmientras; para i:=p hasta r hacer A[i]:=B[i] fpara fMerge; {Ordenada(A,p,r)} l 8 2. CORRECCIÓN Y EFICIENCIA DE LOS DyV La corrección se realiza por inducción sobre el tamaño del problema. l Consiste en demostrar que la operación “combinar” es correcta si las soluciones de las que parte también lo son. l 9 La eficiencia. Teoremas l Teorema 1: La solución de la ecuación T(n)=aT(n/b)+O(nk), con a>=1 y b>1 es O(nlogba) si a>bk O(nklogn) si a=bk O(nk) si a<bk Dem. [Weiss,pp.383] 10 La eficiencia. Teoremas l Teorema 2: La solución de la ecuación T(n)=aT(n/b)+O(nklogpn), con a>=1, b>1 y p>=0 es O(nlogba) si a>bk O(nklogp+1n) si a=bk O(nklogpn) si a<bk 11 Ordenación Rápida: QuickSort DIVIDE: En A[p..r] se establece una Partición en dos subv. no vacíos A[p..q] y A[q+1..r] tal que cada elemento del 1º es menor o igual que cada uno de los del 2º (q se calcula en partición). l VENCER: ordenar los dos subvectores llamando a QuickSort. l COMBINAR: no hay que hacer nada. l 12 Algoritmo QuickSort Acción QuickSort (A,p,r) si p<r entonces q:=PARTICIÓN(A,p,r); QuickSort(A,p,q); QuickSort(A,q+1,r); fsi facción 13 La elección del pivote ¿Elegir el primer elemento? l ¿Elegirlo al azar? l ¿Tomar la mediana de tres? l n La mediana entre el 1º el último y el central. Ej: 8,1,4,9,6,3,5,2,7,0 (piv=6) l Otras…. 14 El algoritmo Partición {p<=r} Función Partición (A,p,r) devuelve q /* x es el pivote */ p r <=x >=x q 15 1 2 3 4 5 6 7 8 9 65 70 75 80 85 60 55 50 45 65 45 75 80 85 60 55 50 70 65 45 50 80 85 60 55 75 70 65 45 50 55 85 60 80 75 70 65 45 50 55 60 85 80 75 70 60 45 50 55 65 85 80 75 70 16 Algoritmo PARTICION (var v:vector; ini,fin:entero; var pos:entero); var var izq,der,pos: entero; p:tipobase; p:=v[ini]; izq:=ini; der:=fin; repetir repetir izq:=izq+1 hasta v[izq]>=p repetir der:=der-1 hasta v[der]<=p Intercambiar (v[izq],v[der]); hasta der<izq; Intercambiar (v[izq],v[der]); /* deshace el último cambio */ Intercambiar (v[ini],v[der]); pos:=der; fparticion 17 Análisis de QS l Caso Peor: Partición desequilibrada T(n)=T(1)+T(n-1)+k’n n>1 T(n)=k n=1 T(n) ∈ Θ(n2) l Caso Mejor: Partición equilibrada T(n)=2T(n/2)+k’n n>1 T(n) ∈ Θ(nlogn) 18 Análisis de QS (cont.) l Coste promedio: asumimos que todas las instancias son equiprobables 1 n −1 T(n) = ∑ ( k ' n + T(i) + T(n − i)) = n i =1 n −1 2 = ∑ T(i) + kn ∈ Θ( n log n) n i =1 19 El problema de la Selección l Encontrar el i-ésimo elemento mayor (o menor) en una lista de n números n Caso particular: Encontrar la mediana [i=n/2] 20 Método para Selección Se efectúa Partición sobre A[p..r] l Si i<=|V1| el i-ésimo elemento menor estará en V1 l Si i=|V1|+1 el i-ésimo elemento menor es el pivote l Si i>|V1| el i-ésimo elemento menor estará en V2, y será el (i-|V1|-1)-ésimo menor de V2 l 21 El algoritmo Selección Función Selección (A,p,r,i) dev TipoBase var k:entero; si p<r entonces q:=PARTICIÓN(A,p,r); k:=q-p+1; /*Nº elementos de 1ª parte*/ si i<=k entonces dev Selección(A,p,q,i); sino dev Selección(A,q+1,r,i-k); sino dev A[p] 22 Análisis de la CT de Selección (n=r-p+1) l Caso Peor: Partición desequilibrada T(n)=T(n-1)+k’n n>1 T(n) ∈ Θ(n2) l Caso Mejor: Partición equilibrada T(n)=T(n/2)+k’n n>1 T(n) ∈ Θ(n) l Caso Medio: T(n) ∈ Θ(n). Ejercicio. 23 MULTIPLICACIÓN DE MATRICES Por simplicidad, consideraremos matrices cuadradas: C=A x B l Algoritmo directo: l para i:=1 hasta n hacer para j:=1 hasta n hacer C[i,j]:=0; para k:=1 hasta n hacer C[i,j]:=A[i,k]*B[k,j]+C[i,j] 24 El algoritmo de Strassen l Dividir el problema de mult. matrices nxn en términos de la multiplicación de matrices n/2xn/2 A 12 B 11 B 12 C 11 C 12 A 11 C 21 C 22 = A 21 A 22 X B 21 B 22 = A 11 B 12 + A 12 B 22 A 11 B 11 + A 12 B 21 = A B A B A B A B 21 11 + 22 21 21 12 + 22 22 l ¿Mejora el coste de la solución directa? 25 El alg. de Strassen (cont.) l Reducir el nº de subproblemas, aunque se incremente el nº de operaciones en cada llamada (Efecto de la cte oculta) M1=(A12-A22)x(B21+B22) M2=(A11+A12)x(B11+B22) M3=(A11-A21)x(B11+B12) M4=(A11+A12)xB22 M5=A11x(B12-B22) M6=A22x(A21-B11) M7=(A21+A22)xB11 26 El algoritmo de Strassen (cont.) • Se pueden multiplicar dos matrices nxn haciendo 7 multiplic. de matrices n/2xn/2, pero más sumas y restas, ¿es más eficiente?..... M4 + M5 C11 C12 M1 + M2 − M4 + M6 C21 C22 = M 6 + M 7 M 2 − M 3 + M 5 − M 7 • Complejidad temporal: T(n)=7T(n/2)+k”n2 T(n)=k n>1 n=1 T(n) ∈ Θ (n 2.81) 27 Algoritmo max-min (i,j:entero; var max,min:entero); /* a[1..n] es una variable global */ si (i=j) entonces max:=a[i]; min:=a[j]; /*pequeño*/ sino si i=j-1 entonces /* pequeño */ si a[i]<a[j] entonces max:=a[j]; min:=a[i] sino max:=a[i]; min:=a[j]; fsi; sino /*el problema no es pequeño, se divide */ med:=(i+j)/2; max-min(i,med,max,min); max-min(med+1,j,max1,min1); si max<max1 entonces max:=max1; fsi; sin min>min1 entonces min:=min1; fsi; fsi; fmax-min; MergeSort con listas de punteros a[1..n] vector de enteros link[0..n] vector de enteros. Se interpretan como punteros a a. Una lista es una secuencia de punteros terminda en un 0. Ejemplo: link: [1] [2] [3] [4] [5] [6] [7] [8] 6 4 7 1 3 Dos listas Q=(2,4,1,6) R=(5,3,7,8) 0 8 0 Algoritmo Mergesort1(izq,der,umbral:entero); devuelve entero; si (der-izq)<umbral entonces entonces devuelve OrdeInser(a,link,izq,der); sino med:=(der.izq)/2; q:=Mergesort1(izq,med); r:=MergeSort1(med+1,der); devuelve Merge1(q,r); fsi; fMergesort1;