tema4 2 dy v
TRANSCRIPT
EDI 2009/10 1
4.2 Divide y Vencerás
● 4.2.1 Esquema de la técnica
● 4.2.2 Complejidad
● 4.2.3 Ejemplos� Búsqueda binaria
� Ordenación
� Multiplicación de matrices cuadradas
EDI 2009/10 2
4.2.1 Esquema de la
técnica Divide y Vencerás
● Descomponer el caso a resolver en subcasos
más pequeños del mismo problema.
● Resolver independientemente cada subcaso.
● Combinar los resultados para construir la
solución del caso original.
Este proceso se suele aplicar recursivamente.
La eficiencia de esta técnica depende de cómo se
resuelvan los subcasos.
EDI 2009/10 3
4.2.1 Esquema de la
técnica Divide y Vencerás
Esquema en 3 etapas:
� División. Divide el problema original en k subproblemas de menor tamaño
� Conquistar. Estos subproblemas se resuelven independientemente:
� Directamente si son simples
� Reduciendo a casos más simples (típicamente de
forma recursiva)
� Combinar. Se combinan sus soluciones parciales para obtener la solución del problema original.
El caso más frecuente: k=2
EDI 2009/10 4
4.2.1 Esquema de la
técnica Divide y Vencerás
funcion DivideYVenceras (c: tipocaso) : tiposolucion;
var
x1,..., xk : tipocaso;
y1,...,yk: tiposolucion;
si c es suficientemente simple entonces
devolver solucion_simple(c)
sino descomponer c en x1, ..., xk
para i← 1 hasta k hacer
yi ← DivideYVenceras (xi)
fpara
devolver combinar_solucion_subcasos(y1, ..., yk)
fsi
ffuncion
EDI 2009/10 5
4.2.1 Esquema de la
técnica Divide y Vencerás
● El número de subejemplares, k, suele ser
pequeño e independiente del caso particular a
resolver.
● Cuando k = 1, el esquema divide y vencerás pasa
a llamarse reducción o simplificación.
● Algunos algoritmos de divide y vencerás pueden
necesitar que el primer subejemplar esté resuelto
antes de formular el segundo subejemplar.
EDI 2009/10 6
4.2.1 Esquema de la
técnica Divide y Vencerás
● Para que el enfoque divide y vencerás merezca
la pena, se deben cumplir las siguientes
condiciones:
�Debe ser posible descomponer el caso a resolver en
subcasos.
�Se debe poder componer la solución a partir de las
soluciones de los subcasos de un modo eficiente.
�Los subejemplares deben ser, aproximadamente, del
mismo tamaño.
EDI 2009/10 7
4.2.1 Esquema de la
técnica Divide y Vencerás
Cómo se determina el umbral.
● El umbral será un n0 tal que cuando el tamaño
del caso a tratar sea menor o igual, se resuelva
con un algoritmo básico, es decir, no se
generen más llamadas recursivas.
● La determinación del umbral óptimo, es un
problema complejo.
● Dada una implementación particular, puede
calcularse empíricamente.
EDI 2009/10 8
4.2.1 Esquema de la
técnica Divide y Vencerás
● También puede emplearse una técnica híbrida
para su cálculo:
� Obtener las ecuaciones de recurrencia del algoritmo
(estudio teórico).
� Determinar empíricamente los valores de las
constantes que se utilizan en dichas ecuaciones para
la implementación concreta que estamos empleando.
� El umbral óptimo se estima hallando el tamaño n del
caso para el cual no hay diferencia entre aplicar
directamente el algoritmo clásico o pasar a un nivel
más de recursión.
EDI 2009/10 9
4.2.2 Complejidad
Sea n el tamaño de nuestro caso original y sea k el número de subcasos:
� Existe una constante b tal que el tamaño de los k subcasos es aproximadamente n/b
� Si g(n) es el tiempo requerido por el algoritmo divide y vencerás en casos de tamaño n, sin contar el tiempo necesario para realizar las llamadas recursivas ⇒
t(n) = k*t(n ÷ b) + g(n)� Donde t(n) es el tiempo total requerido por el algoritmo
divide y vencerás, siempre que n sea lo suficientemente grande.
EDI 2009/10 10
4.2.2 Complejidad
Si existe un entero p tal que g(n) ∈ Θ(np),
entonces podemos concluir que:
Esta solución está extraída del ejemplo 4.7.13 del libro �Fundamentos de
Algoritmia� de Barssard y Bratley.
T � n �={�� n p � k<b p
�� n p log n � k=b p
�� nlog
bk� k>b p
} n = tamaño del problema
k = nº de subcasos
n/b = tamaño de los subcasos
EDI 2009/10 11
4.2.3 Ejemplos
Sea T[1..n] un vector ordenado tal que T[j] ≥ T[i]
siempre que n ≥ j ≥ i ≥ 1 y sea x un elemento. El
problema consiste en buscar x en el vector T.
Es decir, queremos hallar un i tal que n ≥ i ≥ 1
y x = T[i], si x ∈ T.
Búsqueda Binaria
EDI 2009/10 12
4.2.3 Ejemplos
El algoritmo secuencial de búsqueda estará en el
orden de O(n).
Mejor aproximación aprovechar la propiedad de
que el vector está ordenado.
Búsqueda Binaria
jkkiki
302423121097730-2
1110987654321
x = 8
sí
T[k] ≥ x?
j nonoij
k
EDI 2009/10 13
Identificación del problema con el esquema
● División: El problema se puede descomponer
en subproblemas de menor tamaño (k = 1)
● Conquistar: No hay soluciones parciales, la
solución es única
● Combinar: No es necesario.
4.2.3 EjemplosBúsqueda Binaria
EDI 2009/10 14
4.2.3 Ejemplos
Pasos del algoritmo de búsqueda binaria :
● Se compara x con el elemento que se encuentra en la
posición
● Si T[k] ≥ x la búsqueda continúa en T[i..k]
Si T[k] < x la búsqueda continúa en T[k+1..j]
● Los pasos 1 y 2 continuarán hasta
� localizar x, o
� determinar que no está en T
Búsqueda Binaria
k=i+j
2
EDI 2009/10 15
funcion busquedabin(T[1..n],x)
si x < T[1] o x > T[n] entonces
devolver n + 1
sino
devolver binrec(T[1..n],x)
fsi
ffuncion
funcion binrec (T[i..j],x)
{Búsqueda binaria de x en T[i..j] con la seguridad de que T[i-1] < x <= T[j]}
si i = j entonces
devolver I
sino
k ← (i + j) ÷ 2
si x <= T[k] entonces
devolver binrec(T[i..k],x)
sino
devolver binrec(T[k + 1..j],x)
fsi
fsi
ffuncion
Búsqueda Binaria
4.2.3 Ejemplos
EDI 2009/10 16
4.2.3 Ejemplos
Coste
g(n) ∈ Θ (np), en binrec g(n) ∈ O(1) = O(n0), p = 0
No combinamos soluciones: hay 1 caso ⇒ k = 1
En cada paso dividimos el tamaño del problema a la mitad ⇒ b = 2
k = bp ⇒ 1 = 20
T(n) ∈ Θ(np log n)⇒ T(n) ∈ Θ(log n)
Búsqueda Binaria
T � n �={�� n p � k<b p
�� n p log n � k=b p
�� nlog
bk� k>b p
}
EDI 2009/10 17
4.2.3 Ejemplos
Dado un vector T[1..n], inicialmente
desordenado, lo ordenaremos aplicando la
técnica de Divide y Vencerás partiendo el
vector inicial en dos subvectores más
pequeños.
Utilizaremos dos técnicas:
� Ordenación por mezcla (mergesort)
� Ordenación rápida (quicksort)
Algoritmos de Ordenación
EDI 2009/10 18
4.2.3 Ejemplos
Identificación del problema con el esquema
● División: El problema se puede descomponer en
subproblemas de menor tamaño (k = 2)
● Conquistar: Los subvectores se siguen
dividiendo hasta alcanzar un tamaño umbral
● Combinar: Dependerá del tipo de algoritmo
Algoritmos de Ordenación
EDI 2009/10 19
4.2.3 Ejemplos
Pasos del Algoritmo:
1. Dividir el vector en dos mitades
2. Ordenar esas dos mitades recursivamente
3. Fusionarlas en un solo vector ordenado.
Algoritmos de Ordenación. Mergesort
EDI 2009/10 20
853562971413
121110987654321
7
5
91413
64321
5
11
83562
1210987
Algoritmos de Ordenación. Mergesort
413
321
971
654
562
987
853
121110
41
32
97
65
56
98
85
1211
3
1
1
2
4
3
1
4
7
5
9
6
2
7
6
8
5
9
3
10
5
11
8
12
431
321
7
5
94311
64321
65
98
652
987
6
11
85532
1210987
987655433211
121110987654321
4.2.3 Ejemplos
EDI 2009/10 21
procedimiento fusionar(U[1..m+1], V[1..n+1], T[1..m+n])
{Fusionar las matrices ordenadas U[1..m] y V[1..n] almacenándolas en T[1..m+n],U[m+1] y V[n+1] se utilizan como centinelas}
i, j ← 1
U[m+1], V[n+1] ← ∞
para k ← 1 hasta m+n hacer
si U[i] < V[j]entonces
T[k] ← U[i];
i ← i + 1
sino T[k] ← V[j];
j ← j + 1
fsi
fpara
fprocedimiento
4.2.3 EjemplosAlgoritmos de Ordenación. Mergesort
EDI 2009/10 22
procedimiento ordenarporfusión (T[1..n])
si n es suficientemente pequeño entonces ordenar(T) {P. ej. Ord. por inserción}
sino
vector U[1..1 + n/2], V[1..1 + n/2],U[1..n/2] ← T[1..n/2]V[1.. n/2] ← T[1 + n/2..n]ordenarporfusión(U[1.. n/2])ordenarporfusión(V[1.. n/2])fusionar(U,V,T)
fsi
fprocedimiento
4.2.3 EjemplosAlgoritmos de Ordenación. Mergesort
EDI 2009/10 23
4.2.3 Ejemplos
Coste
g(n) ∈ Θ (np), en mergesort g(n) ∈ Θ (n) = Θ (n1), p = 1
Dos subproblemas ⇒ k = 2
En cada paso dividimos el tamaño del problema a la mitad ⇒ b = 2
k = bp ⇒2 = 21
T(n) ∈ Θ(np log n)⇒ T(n) ∈ Θ(n log n)
Algoritmos de Ordenación. Mergesort
T � n �={�� n p � k<b p
�� n p log n � k=b p
�� nlog
bk� k>b p
}
EDI 2009/10 24
4.2.3 Ejemplos
Pasos del Algoritmo:
� Escoger un elemento de la matriz a ordenar
como pivote.
� Se parte el vector a ambos lados del pivote.
Los elementos mayores que el pivote se
almacenan a la derecha del mismo y los
demás a la izquierda.
� El vector se ordena mediante llamadas
recursivas a este algoritmo.
Algoritmos de Ordenación. Quicksort
EDI 2009/10 25
Selección del pivote:
Cualquier elemento es válido, lo más
sencillo es escoger el que ocupa la
primera posición del subvector
Mejor pivote: la mediana
4.2.3 EjemplosAlgoritmos de Ordenación. Quicksort
EDI 2009/10 26
14
10
8
11
4356-50634211749
12987654321p = 9
b = 1
i ji j
8 17
i jjj
21-5
i j
340
i
i
j i
96
0-5846
54321p = 6
b = 1
i ji
0 8
i
i
j i
-5 6
4.2.3 EjemplosAlgoritmos de Ordenación. Quicksort
04-5
321p = -5
b = 1
i j
jj 04
32p = 4
b = 2
i
j
ij
40
40-5
321
8640-5
54321
14
10
17
11
4356213498640-5
12987654321
431714562134
121110987p = 34
b = 7
i ji j
5617
i
i
j i
3414
ji
172114
987p = 14
b = 7
jj
2117
j
1721
98p = 21
b = 8
i i
1721
211714
987
435634172114
121110987
i
j
4356
1211p = 56
b = 11
j i
5643
564334172114
121110987
34
10
43
11
5621171498640-5
12987654321
34
10
43
11
5621171498640-5
12987654321
34
10
43
11
5621171498640-5
12987654321
EDI 2009/10 27
procedimiento pivote (T[i..j]; var b)
p ← T[i]
k ← i
b ← j + 1
repetir
k ← k + 1
hasta que T[k] > p o k >= j frepetir
repetir
b ← b � 1
hasta que T[b] <= p frepetir
mientras k < b hacer
intercambiar T[k] y T[b]
repetir
k ← k + 1
hasta que T[k] > p frepetir
repetir
b ← b � 1
hasta que T[b] <= p frepetir
fmientras;
intercambiar T[i] y T[b]
fprocedimiento
4.2.3 EjemplosAlgoritmos de Ordenación. Quicksort
EDI 2009/10 28
procedimiento ordenacion_rapida(T[i..j])
{Ordena la submatriz T[i..j] por orden no decreciente}
si j � i es suficientemente pequeño entonces
ordenar (T[i..j]) {P.ej., Ord. por inserción}
sino
pivote(T[i..j],b);
ordenacion_rapida (T[i..b-1])
ordenación_rapida (T[b+1..j])
fsi
fprocedimiento
4.2.3 EjemplosAlgoritmos de Ordenación. Quicksort
EDI 2009/10 29
Coste:
● Si partimos de la hipótesis de que todos los elementos de T son diferentes ⇒ las n! permutaciones tienen la misma probabilidad
● El valor b devuelto por pivote(T[1..n],b) será un entero entre 1 y n con probabilidad 1/n
● pivote(T[1..n],b) requiere un tiempo g(n) ∈ Θ(n)
4.2.3 EjemplosAlgoritmos de Ordenación. Quicksort
EDI 2009/10 30
� Si suponemos que: � el orden inicial del vector es aleatorio
� los elementos de T son diferentes en su mayoría
� todas las n! permutaciones de sus elementos son igualmente probables
� los subproblemas estarían equilibrados
El orden sería: O(n log n) � Aunque los subproblemas no estén del todo
equilibrados se suele asumir que el coste es O(n log n)
4.2.3 EjemplosAlgoritmos de Ordenación. Quicksort
EDI 2009/10 31
� Los casos peores:
� el vector está inicialmente ordenado
� todos los elementos son iguales
⇒ p = i siempre 2 subproblemas:� uno de tamaño 0
� el segundo de tamaño j - i + 1
� El coste sería: O(n2)
En general, se suele considerar el caso promedio O(n log n)
4.2.3 EjemplosAlgoritmos de Ordenación. Quicksort
EDI 2009/10 32
Sean A y B dos matrices de tamaño n x n,
se desea calcular su producto aplicando el
método de divide y vencerás.
Dos aproximaciones:
� cuando n es potencia de 2
� cuando n no es potencia de 2: Añadir filas y
columnas de ceros hasta que lo sea.
4.2.3 EjemplosMultiplicación de Matrices cuadradas
EDI 2009/10 33
4.2.3 EjemplosMultiplicación de Matrices cuadradas. Potencia de 2
4321B
4
3
2
1
1254
3645
5932
6326
4
3
2
1
A 4321
5727
3316
6483
3548
4321C
4
3
2
1
7678
6393
=X
C1,1 = A1,1 * B1,1 + A1,2 * B2,1 + A1,3 * B3,1 + A1,4 * B4,1
C1,2 = A1,1 * B1,2 + A1,2 * B2,2 + A1,3 * B3,2 + A1,4 * B4,2
C2,1 = A2,1 * B1,1 + A2,2 * B2,1 + A2,3 * B3,1 + A2,4 * B4,1
C2,2 = A2,1 * B1,2 + A2,2 * B2,2 + A2,3 * B3,2 + A2,4 * B4,2
EDI 2009/10 34
4.2.3 EjemplosMultiplicación de Matrices cuadradas. Potencia de 2
4321B
4
3
2
1
1254
3645
5932
6326
4
3
2
1
A 4321
5727
3316
6483
3548
4321C
4
3
2
1
7678
6393
=X
54
45
32
26
6483
3548
EDI 2009/10 35
4.2.3 EjemplosMultiplicación de Matrices cuadradas. Potencia de 2
4321B
4
3
2
1
1254
3645
5932
6326
4
3
2
1
A 4321
5727
3316
6483
3548
4321C
4
3
2
1
7678
6393
=X
54
45
32
266483
3548
8
4
3
8
6
3
4
5
3
2
2
6
5
4
4
5
EDI 2009/10 36
4.2.3 Ejemplos
4321B
4
3
2
1
1254
3645
5932
6326
4
3
2
1
A 4321
5727
3316
6483
3548
4321C
4
3
2
1
7678
6393
=X
3
2
2
6
5
4
4
5
*
*
30
34
28
56
46
44
35
37
=
=
Multiplicación de Matrices cuadradas. Potencia de 2
8
4
3
8
6
3
4
5+3
034
28
56 4
644
35
37 7
678
63
93
EDI 2009/10 37
4.2.3 Ejemplos
B4B3
B2B1
1254
3645
5932
6326
A4A3
A2A1
5727
3316
6483
3548
C4
C2
76
63
C3
78
93
C1
C1 = A1*B1 + A2*B3
64
35
3
2
2
6
54
45
8
4
3
8* + *
7678
6393=
Multiplicación de Matrices cuadradas. Potencia de 2
EDI 2009/10 38
4.2.3 Ejemplos
B4B3
B2B1
1254
3645
5932
6326
A4A3
A2A1
5727
3316
6483
3548
C4
C2
76
63
C3
78
93
C1
Multiplicación de Matrices cuadradas. Potencia de 2
B4
B3
B2
B1
64
35
A4
A3
A2
A1
8
4
3
8*
C1 = A1*B1 + A2*B3 8 5* + 4 4* =
C3C3
C2C1
=
56
56
EDI 2009/10 39
Identificación del problema con el esquema
● División: El problema se puede descomponer
en subproblemas de menor tamaño (k = 4)
● Conquistar: Los submatrices se siguen
dividiendo hasta alcanzar un tamaño 1
● Combinar: sumar los resultados intermedios
4.2.3 EjemplosMultiplicación de Matrices cuadradas. Potencia de 2
EDI 2009/10 40
procedimiento multiplica (A,B: TipoMatriz; VAR C: TipoMatriz);
Var A11,A12,A21,A22,B11,B12,B21,B22,C11,C12,C21,C22,CAux: TipoMatriz;
si tamaño(A) = 1 entonces
C ← A*B
sino
DividirEnCuadrantes(A,A11,A12,A21,A22);
DividirEnCuadrantes(B,B11,B12,B21,B22);
para i ← 1 hasta 2 hacer
para j ← 1 hasta 2 hacer
Inicializa(Cij)
para k ← 1 hasta 2 hacer
multiplica(Aik,Bkj,CAux);
Suma(Cij,CAux)
fpara
fpara
fpara
ColocarCuadrantes(C,C11,C12,C21,C22);
fsi
fprocedimiento
4.2.3 EjemplosMultiplicación de Matrices cuadradas. Potencia de 2
EDI 2009/10 41
4.2.3 EjemplosMultiplicación de Matrices: Algoritmo de Strassen
b22
b21
b12
b11
a22
a12
a21
a11
* =c
11c
12
c21
c22
m1 = (a
21 + a
22 � a
11)(b
22 � b
12 + b
11)
m2 = a
11b
11
m3 = a
12b
12
m4 = (a
11 � a
21)(b
22 � b
12)
m5 = (a
21 � a
22)(b
12 � b
11)
m6 = (a
12-a
21+a
11-a
22)b
22
m7 = a
22(b
11-b
22-b
11-b
21)
c11
= m2 + m
3
c12
= m1 + m
2 + m
5 + m
6
c21
= m1 + m
2 + m
4 + m
7
c22
= m1 + m
2 + m
4 + m
5
Se reduce de 8 a 7 el número de productos necesarios
EDI 2009/10 42
● Si consideramos que cada componente aij y b
ij
pueden ser matrices de nxn este algoritmo resulta
interesante
● Sea t(n) en tpo necesario para multiplicar dos
matrices de tamaño n mediante el algoritmo de
strassen:
t(n) = 7t(n/2) + g(n)
● g(n) es suma de matrices de tamaño n:
g(n) ∈ Θ(n2)
4.2.3 EjemplosMultiplicación de Matrices: Algoritmo de Strassen
EDI 2009/10 43
4.2.3 Ejemplos
Coste
g(n) ∈ Θ (np), en Strassen g(n) ∈ O(np) = O(n2), p = 2
hay 7 subcasos ⇒ k=7
En cada paso dividimos el tamaño del problema a la mitad ⇒ b = 2
k > bp ⇒ 7 = 22
T(n) ∈ Θ(nlogbk )⇒ T(n) ∈ Θ(nlg(7) )
Multiplicación de Matrices: Algoritmo de Strassen
T � n �={�� n p � k<b p
�� n p log n � k=b p
�� nlog
bk� k>b p
}