tema4 2 dy v

22

Upload: independent

Post on 22-Feb-2023

1 views

Category:

Documents


0 download

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

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

}