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;

Documentos relacionados