Está en la página 1de 36

ESTRUCTURAS DE DATOS

y ALGORITMOS
Licenciatura en Ciencias de la Computación

TÉCNICAS DE DISEÑO DE
ALGORITMOS
Estructuras de datos y Algoritmos

Técnicas de diseño de algoritmos


La algoritmia estudia las propiedades de los algoritmos, y
nos ayuda a elegir la solución más adecuada en cada
situación.
Una buena elección puede llevar a ahorrar tiempo y
dinero, e incluso marcar la diferencia entre poder o no
poder resolver un problema.

Las “técnicas” o “esquemas”


de diseño de algoritmos son
herramientas que facilitan el
desarrollo de programas.
Estructuras de datos y Algoritmos

Técnicas de diseño de algoritmos

 Divide y Vencerás

 Algoritmos Ávidos o Voraces- Greedy

 Programación Dinámica

 Vuelta Atrás - Backtracking

 Ramificación y Poda - Branch and Bound


Estructuras de datos y Algoritmos

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

1. Se descompone el problema en k subproblemas


de menor tamaño.

2. Todos los subproblemas se resuelven


independientemente, de manera directa si son
elementales o en forma recursiva.

3. Se combinan las soluciones obtenidas en el paso


anterior para construir la solución del problema
original.
Estructuras de datos y Algoritmos

Divide y Vencerás
Esquema Iterativo

divide_venceras (p: problema)

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

para i = 1, 2, ..., k
si = resolver (pi)

solucion = combinar (s1, s2, ..., sk)


Estructuras de datos y Algoritmos

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)

Youtube: Merge-sort with Transylvanian-saxon (German) folk dance


Estructuras de datos y Algoritmos

Algoritmos Ávidos, Voraces o


Greedy
 Construyen la solución a un problema en
etapas sucesivas, tratando siempre de tomar
la decisión óptima para cada etapa.

 Se utilizan normalmente en problemas de


optimización, donde una solución está
formada por un conjunto de elementos entre
un conjunto de candidatos (con un orden
determinado o no).
Estructuras de datos y Algoritmos

Algoritmos Ávidos, Voraces o


Greedy
 Estos algoritmos funcionan por pasos:
 Se parte de una solución vacía.

 En cada paso se escoge el siguiente elemento

entre los candidatos, para añadir a la solución.


 Una vez tomada esta decisión no se podrá

deshacer.
 El algoritmo acabará cuando el conjunto de

elementos seleccionados constituya una


solución.
Estructuras de datos y Algoritmos

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”

En cada paso se tiene los siguientes conjuntos:


Candidatos seleccionados para la solución S.
Candidatos seleccionados pero rechazados luego.
Candidatos pendientes de seleccionar C.
Estructuras de datos y Algoritmos

Algoritmos Ávidos
Componentes

 Conjunto de candidatos, entradas del problema.

 Función solución. Comprueba, en cada paso, si el subconjunto actual de


candidatos elegidos forma una solución (no importa si es óptima o no lo es).

 Función de selección. Informa cuál es el elemento más prometedor del


conjunto de candidatos pendientes. Éste no puede haber sido escogido con
anterioridad. Cada elemento es considerado una sola vez. Luego, puede ser
rechazado o aceptado y pertenecerá a la solucion.

 Función de factibilidad. Informa si a partir de un conjunto se puede llegar a


una solución. Se aplica al conjunto de elementos seleccionados unido con el
elemento más prometedor.

 Función objetivo. Indica si a partir del conjunto de candidatos C es posible


construir una solución (posiblemente añadiendo otros elementos). Es aquella
que se quiere maximizar o minimizar, el núcleo del problema.
Estructuras de datos y Algoritmos

Algoritmos Ávidos
Ejemplo

Problema del cambio de monedas


 Dado un sistema monetario de longitud n y una
cantidad de cambio, devolver una solución (si existe)
que indique el número de monedas equivalente al
cambio, es decir, que muestre el cambio P a partir de
monedas del sistema.

Dado un sistema monetario que contiene monedas de valor 10, 6, 5 y 1 y la


cantidad que se desea cambiar es, por ejemplo, P=18 : Como se conforma la
solución en cuanto a cantidad de monedas y los valores de las mismas?
Estructuras de datos y Algoritmos

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

Devolver-cambio (P: integer; C: array [1..N] of integer;


var X: array [1..N] of integer);
cambio = 0
para i = 1,2,...,N
X[i] = 0
mientras act  P
j = el mayor elemento de C tal que C[j]  (P - cambio )
si j=0 then { Si no existe ese elemento }
devolver “No existe solución”;
X[j] = (P - cambio ) div C[j]
cambio = cambio + C[j]*X[j]
Estructuras de datos y Algoritmos

Algoritmos Ávidos
Aplicaciones

 Algoritmos de Prim y de Kruskal:


Encuentran un árbol de expansión o de
recubrimiento mínimo en un grafo
ponderado (cableado de una casa)

 Algoritmo de Dijkstra: Encuentra el


camino mínimo entre pares de nodos
Estructuras de datos y Algoritmos

Programación Dinámica
Divide y Vencerás particiona el problema en
subproblemas independientes, combinando
las soluciones para resolver el problema
original.

Es una alternativa poco eficiente si los


subproblemas no son independientes,
pues se repite la realización de cálculos.

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.

 Es una técnica ascendente, aunque


pueden plantearse soluciones
descendentes, recursivas.
Estructuras de datos y Algoritmos

Programación Dinámica
Esquema General

1. Caracterizar la estructura de una solución


optima.

2. Definir (recursivamente) el valor de una


solución optima.

3. Calcular el valor de una solución óptima a


partir de soluciones parciales almacenadas.

4. Construir la solución óptima a partir de la


información almacenada.
Estructuras de datos y Algoritmos

Programación Dinámica
Sucesión de Fibonacci

0,1,1,2,3,5,8,13,21,34,55,89…..

descripta por Fibonacci como la solución a un problema


de la cría de conejos:

"Cierto hombre tenía una pareja de conejos juntos en un


lugar cerrado y deseaba saber cuántos son creados a
partir de este par, en un año, cuando es su naturaleza
parir otro par en un simple mes, y en el segundo mes los
nacidos parir también"
Estructuras de datos y Algoritmos

Programación Dinámica
Sucesión de Fibonacci

Al contar la cantidad de letras distintas en cada mes, se puede saber la cantidad


de parejas totales que hay hasta ese mes.
Estructuras de datos y Algoritmos

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

 Algoritmo de Warshall: encuentra la


matriz de caminos de un grafo G, a
partir de su matriz de adyacencia

 Algoritmo de Floyd: encuentra la matriz


de caminos mínimos de un grafo G, a
partir de su matriz de peso
Estructuras de datos y Algoritmos

Vuelta Atrás - Backtracking


 El objetivo, que consiste en encontrar
soluciones para algún problema, se
consigue construyendo soluciones
parciales.
 Se asemeja a un recorrido en
profundidad dentro de un grafo dirigido.
 Se aplica especialmente a problemas de
optimización.
Estructuras de datos y Algoritmos

Vuelta Atrás-
Esquema General

1. A medida que progresa el recorrido se van


construyendo soluciones parciales (n-tupla)
2. Si se llega a una hoja y la solución no es
completa el recorrido no tiene éxito y vuelve
atrás
3. Elimina el último elemento de la tupla
4. Intenta construir la solucion añadiendo otro
elemento diferente
5. Si se llega a una hoja que es una solución
completa el recorrido ha tenido éxito
6. Si sólo se busca una solución, el algoritmo se
detiene
7. En caso contrario, se realiza una Vuelta Atrás
Estructuras de datos y Algoritmos

Vuelta Atrás- Backtracking

 Las soluciones parciales limitan las


regiones en las cuales encontrar una
solución completa.
 El recorrido tiene éxito si, procediendo
de esta forma, se puede definir por
completo una solución.
Estructuras de datos y Algoritmos

Vuelta Atrás- Backtracking

 El recorrido no tiene éxito si alguna


etapa de la solución parcial no se puede
completar.
 En situación de no éxito, el recorrido
vuelve atrás. Si vuelve a un nodo que
tiene uno o mas vecinos sin explorar,
prosigue el recorrido de una solución.
Estructuras de datos y Algoritmos

Vuelta Atrás- Backtracking


Aplicaciones

 Laberinto: Dado un laberinto, el problema consiste


en diseñar un algoritmo que encuentre un camino,
si existe, para ir de la entrada a la salida.

 Coloreado de mapas: Dado un mapa, ¿pueden


colorearse sus regiones o países de forma tal que
no haya regiones o países adyacentes de igual
color?

 Reconocimiento de grafos: Dados dos grafos, el


problema consiste en determinar si ambos son
iguales.
Estructuras de datos y Algoritmos

Ramificación y Poda-
Branch and Bound

 Al igual que Vuelta Atrás, realiza una


enumeración parcial del espacio de
soluciones basándose en la generación
de un árbol de expansión.
 Es una variante del método Vuelta
Atrás, y se aplica generalmente a
problemas de optimización.
Estructuras de datos y Algoritmos

Ramificación y Poda
Esquema General

1. Selección: selecciona el nodo vivo que será


ramificado (dependerá de la estrategia)
2. Ramificación: se generan los hijos del nodo
seleccionado (sólo tuplas prometedoras)
3. Cálculo de cotas: Para cada nodo, se calcula una
cota del posible mejor valor alcanzable desde ese
nodo
4. Poda: se podan los nodos generados en la etapa
anterior que no van a conducir a una solución mejor
que la mejor conocida hasta ahora .
Estructuras de datos y Algoritmos

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

 Se realiza una estrategia de Poda,


en la que en cada nodo se calcula
una cota del posible valor de
aquellas soluciones que pudiesen
encontrarse mas adelante en el
árbol.
Estructuras de datos y Algoritmos

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.

Youtube: EST-C7_AxPi - Cap 2 (2) - Posibilidades -


Problema del viajante de comercio.avi
Estructuras de datos y Algoritmos

Ramificación y Poda
Aplicación

El plomero con multas:


A partir de N trabajos pendientes, cada uno de
ellos con una duración (los días que tarda en
realizarse), un plazo límite, y una multa en caso
de que no se ejecute dentro del plazo límite
establecido para él. Se pide determinar la fecha
de comienzo de cada uno de los trabajos para
que la multa total sea mínima.
Referencias
 Brassard, G. ; Bratley, P. Fundamentos de Algoritmia.(2000) .
Prentice Hall.

 Guerequeta, Rosa; Vallecillo, Antonio. (1998) Técnicas de


Diseño de Algoritmos. Servicio de Publicaciones de la
Universidad de Málaga.
http://www.lcc.uma.es/~av/Libro/indice.html

 Lee R. C. T., Tseng S. S., Chang R. C., Tsai Y. T. (2007).


Introducción al diseño y análisis de algoritmos. Un
enfoque estratégico. Mc Graw Hill Iberoamericana.

También podría gustarte