Documentos de Académico
Documentos de Profesional
Documentos de Cultura
y ALGORITMOS
Licenciatura en Ciencias de la Computación
TÉCNICAS DE DISEÑO DE
ALGORITMOS
Estructuras de datos y Algoritmos
Divide y Vencerás
Programación Dinámica
Divide y Vencerás
Esta técnica consiste en resolver un
problema a partir de la solución de
subproblemas del mismo tipo, pero de
menor tamaño, hasta alcanzar
subproblemas lo suficientemente
pequeños para ser solucionados
directamente.
Es un método de refinamiento progresivo.
Estructuras de datos y Algoritmos
Divide y Vencerás
Esquema General
Divide y Vencerás
Esquema Iterativo
para i = 1, 2, ..., k
si = resolver (pi)
Divide y Vencerás
Esquema Recursivo
divide_venceras (p, q: indice)
var m: indice
si pequeño (p, q)
solucion = solucion_directa (p, q)
en otro caso
m = dividir (p, q);
solucion = combinar
(divide_venceras (p, m),
divide_venceras (m+1, q));
Divide y Vencerás
MergeSort
MergeSort (i, j: integer)
/* Es pequeño si el tamaño es menor que un caso base */
si pequeño(i, j)
OrdenaciónDirecta(i, j)
en otro caso
/* El array original es dividido en dos trozos de tamaño igual (o lo más parecido
posible), es decir n/2 y n/2 */
s = (i + j) div 2
/* Resolver recursivamente los subproblemas */
MergeSort(i, s)
MergeSort(s+1, j)
/* Mezcla dos listas ordenadas. En O(n) */
Combina (i, s, j)
deshacer.
El algoritmo acabará cuando el conjunto de
Algoritmos Ávidos
Esquema General
Funcion voraz (C:conjunto):conjunto;
{C es el conjunto de candidatos}
S Փ {Se construye la solucion en el conjunto S}
mientras C ≠Փ y no solucion(S) hacer
x seleccionar (C)
C C – {x}
si factible (S Ս {x}) entonces
S S Ս {x}
Si solucion (S) entonces devolver S
sino devolver “no hay solucion”
Algoritmos Ávidos
Componentes
Algoritmos Ávidos
Ejemplo
Algoritmos Ávidos
Ejemplo
Candidatos iniciales: todos los tipos de monedas disponibles. Monedas de valor
10, 6, 5 y 1
Solución: conjunto de monedas que suman la cantidad P.
Una solución será de la forma (x1, x2, x3, x4), donde xi es el número de monedas
de tipo i. Se supone que la moneda i vale ci.
Funciones:
solución. El valor actual será solución si xi·ci = P comprueba si el valor de
las monedas seleccionadas hasta el momento, es exactamente el valor que hay
que pagar.
objetivo. La función a minimizar es xi, el número de monedas resultante.
Cuenta el conjunto de monedas utilizadas en la solución.
seleccionar. Elegir en cada paso la moneda de valor más alto posible, pero
menor que el valor que queda por devolver.
factible. Un conjunto de monedas es factible si su valor total no sobrepasa la
cantidad que hay que pagar.
En lugar de seleccionar monedas de una en una, se puede usar la división entera y
escoger todas las monedas posibles de mayor valor.
Estructuras de datos y Algoritmos
Algoritmos Ávidos
Ejemplo
Algoritmos Ávidos
Aplicaciones
Programación Dinámica
Divide y Vencerás particiona el problema en
subproblemas independientes, combinando
las soluciones para resolver el problema
original.
Programación Dinámica
Estructuras de datos y Algoritmos
Programación Dinámica
Resuelve subproblemas una sola vez,
guardando sus soluciones en una
tabla para su futura utilización.
Programación Dinámica
Esquema General
Programación Dinámica
Sucesión de Fibonacci
0,1,1,2,3,5,8,13,21,34,55,89…..
Programación Dinámica
Sucesión de Fibonacci
Programación Dinámica
Fibonacci- Solución Recursiva
Fibonacci (N)
Si N = 0
Fibonacci←0 // Caso Base
else
Si N = 1
Fibonacci←1 // Caso Base
else
Fibonacci← Fibonacci (N-1) +
Fibonacci (N-2)
Complejidad O(cten )
Estructuras de datos y Algoritmos
Programación Dinámica
Fibonacci- Solución Iterativa
#include<stdio.h>
#define MAX 10
main()
{int i; int fib[MAX];
fib[0]=1;
fib[1]=1;
for(i=2;i< MAX; i++)
{
fib[i]= fib[i-1]+ fib[i-2];
}
}
Complejidad O(n)
Estructuras de datos y Algoritmos
Programación Dinámica
Aplicaciones
Vuelta Atrás-
Esquema General
Ramificación y Poda-
Branch and Bound
Ramificación y Poda
Esquema General
Ramificación y Poda
A diferencia con Vuelta Atrás, la
generación de nodos del árbol de
expansión se realiza según distintas
estrategias:
Recorrido en anchura: estrategia FIFO
Recorrido en profundidad: estrategia LIFO
Utilizar una función de coste para seleccionar el
nodo que en principio parece mas prometedor:
estrategia de Mínimo Coste
Estructuras de datos y Algoritmos
Ramificación y Poda
Ramificación y Poda
Aplicación
El Viajante de Comercio:
A partir de conocer las distancias entre
cierto número de ciudades, un viajante
debe partir de una de ellas, visitar cada
ciudad exactamente una vez, y regresar al
punto de partida, habiendo recorrido en
total la menor distancia posible.
Ramificación y Poda
Aplicación