Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Divide
y
vencers
Mtodo
g eneral
La
tcnica
divide
y
vencers
consiste
en:
Descomponer
un
problema
en
un
conjunto
de
subproblemas
ms
pequeos.
Se
resuelven
estos
subproblemas.
Se
combinan
las
soluciones
para
obtener
la
solucin
para
el
problema
original.
PROB SOLU
PROBLEMA
SOLUCIN
LEMA CIN
Lo
importante
es
que
los
sub
problemas
son
del
mismo
tipo
que
el
problema
original
pero
de
menor
tamao,
y
se
resuelven
usando
la
misma
tcnica.
Algoritmo
General
funcin
divide
y
venceras
(x:problema)
dev
y:solucn
si pequeo(x) entonces
si no
yj:=divide y venceras(xj)
n para
yj:=combinar(y1yk)
n de si
Fin
d
funcin
Algoritmo
simplicado
DivideVencers
(p:
problema)
F(0) = F(1) = 1
Estrategias
militares.
Demostraciones
lgicas
y
matemticas.
Diseo
modular
de
programas.
Diseo
de
circuitos.
Ejercicio:
Dos
amigos
matan
el
tiempo
de
espera
en
la
cola
del
cine
jugando
a
un
juego
muy
sencillo:
uno
de
ellos
piensa
en
un
nmero
natural
positivo
y
el
otro
debe
adivinarlo
preguntando
solamente
si
es
menor
o
igual
que
otros
nmeros.
Disear
un
algoritmo
eciente
para
adivinar
el
nmero.
(Bsqueda
______________).
Solucin
Bsqueda
lineal?
Si
el
nmero
fuese
muy
grande
y
se
inicia
preguntando
desde
el
1
entonces
sera
poco
prctico.
Bsqueda
Binaria
Sera
el
mecanismo
mas
apropiado
para
resolver
el
problema
Es
la
aplicacin
ms
sencilla
de
Divide
y
Vencers
Es
una
aplicacin
de
reduccin
o
simplicacin
Sea
T[1..n]
una
matriz
ordenada
por
orden
no
decreciente:
T[i]
T[j]
siempre
que
1
i
j
n
Problema:
buscar
x
en
la
matriz
T:
Localizar
i
:
1
i
n+1
y
T[i-1]
<
x
T[i]
Aproximacin
directa:
funcion
secuencial(T[1..n],x)
para
i=1
hasta
n
hacer
si
T[i]
x
entonces
devolver
i
devolver
n+1
(r)
siendo
r
el
ndice
que
se
devuelve
Segundo
algoritmo:
funcion
busquedabin(T[1..n],x)
si
n=0
or
x>T[n]
or
x<T[1]
entonces
devolver
n+1
sino
devolver
binrec(T[1..n],x)
n
busquedabin
funcion
binrec(T[i..j],x)
si
i=j
entonces
si
T[i]=x
devolver
i
sino
devolver
n+1
k=(i+j)/2
si
x=T[k]
entonces
devolver
k
si
x
<
T[k]
entonces
devolver
binrec(T[i..k],x)
sino
devolver
binrec(T[k+1..j],x)
n
binrec
t(n)=t(n/2)
+
g(n)
como
l=1,
b=2
y
k=0
t(n)
(log
n)
Tercer
algoritmo
(versin
iterativa):
funcion
biniter(T[1..n],x)
si
x>T[n]
entonces
devolver
n+1
i=1
j=n
mientras
i<j
hacer
k=(i+j)%2
si
x=T[k]
entonces
devolver
k
si
x
<
T[k]
entonces
j=k
sino
i=k+1
n_mientras
devolver
n+1
n
biniter
t(n)
(log
n)
Ejercicio
Programar
en
el
lenguaje
de
programacin
Java
el
algoritmo
de
Torres
de
Hanoi