Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
&
Conquer
Ignacio
Decia
Temario
Introduccin
Esquema
general
Ejemplos
Observaciones
y
conclusiones
Introduccin
Divide
&
Conquer
es
una
tcnica
para
la
resolucin
de
problemas
que
aplica
los
siguientes
pasos:
1. Se
descompone
el
problema
original
en
subproblemas
ms
pequeos.
2. Se
resuelven
los
subproblemas
de
manera
independiente.
3. Finalmente
se
combinan
adecuadamente
las
soluciones
de
los
subproblemas
para
encontrar
la
solucin
al
problema
original.
Introduccin
Con
subproblemas
ms
pequeos
nos
referimos
a
instancias
de
menor
tamao
del
problema
original.
La
misma
tcnica
puede
aplicarse
nuevamente
a
los
subproblemas.
Si
el
subproblema
es
pequeo
se
resuelve
directamente,
de
lo
contrario,
se
aplica
nuevamente
la
misma
idea
de
descomposicin.
Introduccin
Problema
P
Introduccin
Problema
P
Dividir
P1
Dividir
P2
Introduccin
Problema
P
P1
Dividir
P11
Dividir
P12
P2
Dividir
P13
Introduccin
Problema
P
P1
P2
Dividir
P11
P12
P13
P21
Dividir
P22
Introduccin
Problema
P
P1
P11
P12
P2
P13
P21
P22
Introduccin
Problema
P
P1
P11
Resolver
P12
Resolver
P2
P13
Resolver
P21
P22
Introduccin
Problema
P
P1
Combinar
P2
Combinar
Combinar
P11
P12
P13
P21
P22
Introduccin
Problema
P
P1
P2
P21
P22
Introduccin
Problema
P
P1
P2
P21
Resolver
P22
Resolver
Introduccin
Problema
P
P1
P2
Combinar
P21
Combinar
P22
Introduccin
Problema
P
P1
P2
Introduccin
Problema
P
Combinar
P1
Combinar
P2
Introduccin
Problema
P
Denicin
formal
Dado
un
problema
P,
con
una
entrada
de
tamao
n,
se
lo
descompone
en
Pi
subproblemas
,
cada
uno
de
ellos
con
tamao
0
<
ni
<
n.
Se
resuelve
cada
uno
de
los
Pi
subproblemas
(eventualmente
aplicando
la
misma
idea
de
descomposicin).
Finalmente
se
combinan
las
soluciones
para
hallar
la
solucin
del
problema
P.
Esquema
general
Solucion DivideAndConquer (Problema P) {
Solucion S;
Problema [] subproblemas;
Solucion[] subsoluciones;
if (EsCasoBase(P)) {
S = ResolverDirectamente(P);
}
else {
int R = Dividir(P,subproblemas);
for (int i = 1; i <= R; i++) {
subsoluciones[i] = DivideAndConquer(subproblemas[i]);
}
S = Combinar(subsoluciones);
}
return S;
}
Esquema
general
Solucion DivideAndConquer (Problema P) {
Solucion S;
Problema [] subproblemas;
Solucion[] subsoluciones;
if (EsCasoBase(P)) {
S = ResolverDirectamente(P);
ESPECFICO
DE
CADA
}
PROBLEMA
else {
int R = Dividir(P,subproblemas);
for (int i = 1; i <= R; i++) {
subsoluciones[i] = DivideAndConquer(subproblemas[i]);
}
S = Combinar(subsoluciones);
}
return S;
}
Ejemplo
Fibonacci
Fibonacci:
1
,
1
,
2
,
3
,
5,
8,
13,
F(0)
=
F(1)
=
1
F(n)
=
F(n-1)
+
F(n-2)
Ejemplo
Fibonacci
int Fibonacci (int n) {
if (n == 0 || n == 1)
return 1;
else
return Fibonacci(n-1) + Fibonacci (n-2);
}
Ejemplo
Fibonacci
Fibonacci(6)
6
5
Ejemplo
Mergesort
Se
desea
ordenar
una
secuencia
S
de
largo
n
en
orden
creciente.
Estrategia
Divide
&
Conquer:
Se
divide
la
secuencia
S
en
dos
mitades
S1
y
S2
.
Se
ordenan
las
secuencias
S1
y
S2
siguiendo
la
misma
estrategia.
Una
vez
ordenadas
las
secuencias
S1
y
S2
se
combinan
intercalndolas
en
forma
ordenada
(Merge).
Ejemplo
Mergesort
5
Ejemplo
Mergesort
5
5
2
2
6
6
0
7
Ejemplo
Mergesort
5
5
5
2
2
0
7
6
6
Ejemplo
Mergesort
5
5
5
5
2
2
0
7
6
6
Ejemplo
Mergesort
5
5
5
2
2
0
7
6
6
Ejemplo
Mergesort
5
5
5
2
2
6
2
5
2
0
7
Ejemplo
Mergesort
5
5
5
2
2
5
2
7
6
0
0
Ejemplo
Mergesort
5
5
5
2
2
0
7
6
6
0
2
5
2
Ejemplo
Mergesort
5
5
5
2
2
0
7
6
7
0
0
0
2
5
2
5
0
6
2
Ejemplo
Mergesort
void MergeSort (int[] A, int p, int q) {
if (p < q) {
int medio = (p+q)/2;
MergeSort(A, p, medio);
MergeSort(A, medio + 1, q);
MERGE(A, p, medio, medio + 1, q);
}
}
Conclusiones
y
observaciones
Divide
&
Conquer
es
una
tcnica
conceptualmente
simple.
Los
algoritmos
que
se
ob_enen
son
generalmente
recursivos.
Como
los
subproblemas
son
independientes,
en
general
esto
permite
que
sean
resueltos
en
paralelo.
Por
otra
parte,
la
tcnica
puede
conducir
a
que
un
mismo
subproblema
sea
resuelto
varias
veces
(Fibonacci).
Finalmente,
se
mostr
que
un
problema
puede
descomponerse
de
varias
formas
(Mergesort).