You are on page 1of 16

Tcnicas de diseo de algoritmos

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.

De esta forma, el mtodo se expresa de manera natural


mediante un algoritmo recursivo, cuyo esquema general se
muestra a continuacin:


Algoritmo General
funcin divide y venceras (x:problema) dev y:solucn

si pequeo(x) entonces

y:= mtodo directo(x)

si no

[descomponer x en k>=1 problemas ms pequeos]

(x1, x2,xk) := decomponer(xj)

[resolver los sub problemas recursivamente]

para j = 1 hasta k hacer

yj:=divide y venceras(xj)

n para

(combinar los yj para obtener una solucin y para x)

yj:=combinar(y1yk)

n de si

Fin d funcin
Algoritmo simplicado
DivideVencers (p: problema)

Dividir (p, p1, p2, ..., pk)

para i:= 1, 2, ..., k

si:= Resolver (pi)

solucin:= Combinar (s1, s2, ..., sk)


Ejemplo:
Torres de Hanoi

Clculo de los nmeros de Fibonacci

Clculo del factorial

Multiplicacin rpida de matrices

Ordenacin por mezcla (mergesort)

Ordenacin rpida (quicksort)


A B C

Torres de Hanoi. Mover n discos del poste A al C:


Mover n-1 discos de A a B
Mover 1 disco de A a C
Mover n-1 discos de B a C
Hanoi (n, A, B, C: entero)
si n==1 entonces
mover (A, C)
sino
Hanoi (n-1, A, C, B)
mover (A, C)
Hanoi (n-1, B, A, C)
nsi

Si el problema es pequeo, entonces se puede resolver


de forma directa.
Ejemplo. Clculo de los nmeros de Fibonacci.

F(n) = F(n-1) + F(n-2)

F(0) = F(1) = 1

El clculo del n-simo nmero de Fibonacci se descompone


en calcular los nmeros de Fibonacci n-1 y n-2.
Combinar: sumar los resultados de los subproblemas.
La idea de la tcnica divide y vencers es
aplicada en muchos campos:


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

You might also like