Está en la página 1de 7

Ejemplos de Estrategias de diseño de algoritmos.

Algoritmos:

Cualitativo:
Algoritmo para hacer mi agenda diaria.
INICIO
Levantarme a las 6:00 am y bañarme
Dirigirme al trabajo a las 6:50
Entrar al trabajo a las 7:00 pm
Salir del trabajo a las 3:00 pm
Adelantar tareas de 3:30 a 4:00 pm
Tomar el baño
Ir a la escuela de 5:30 a 10:15
Cenar a las 10:40
Dormir a las 3:00 am
FIN

Cuantitativo:
Algoritmo para obtener el área de un triángulo.

INICIO
Declarar (b,h,a)
Ingresar (b,h)
a=(b*h)/2
Mostrar (a)
FIN
Recursividad:

Sucesion de la serie de fibonacci:

Solución recursiva

#include<bits/stdc++.h>
using namespace std;

int fib(int n) {
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}

int main (){


int n = 9;
cout << fib(n);
getchar();
return 0;
}

Solución iterativa

static int fibonacci (int n) {


int actual, ant1, ant2; ant1 = ant2 = 1;
if ((n == 0) || (n == 1)) {
actual = 1;
} else
for (i=2; i<=n; i++) {
actual = ant1 + ant2; ant2 = ant1; ant1 = actual;
}
} return actual;
}

Dividir para conquistar


Problemas pequeños

funcion divide_y_venceras_1(problema)
{
descomponer el problema en n subproblemas más pequeños;
para i=1 hasta n hacer
resolver el subproblema k;
combinar las n soluciones;
}

Problemas grandes

funcion divide_y_venceras(problema)
{
si el problema es trivial
entonces resolver el problema;
si no es trivial
{
descomponer el problema en n subproblemas más pequeños;
para i=1 hasta n hacer
divide_y_venceras(subproblema_k);
combinar las n soluciones;
}
}

Ejemplo.Problema de las torres de Hanoi.


Mover n discos del poste A al C:

Mover n-1discos de A a B
Mover 1 disco de A a C
Mover n-1discos 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)
finsi

El cálculo del n-ésimo número de Fibonacci se descompone en calcular los números


de Fibonacci n-1 y n-2.
El algoritmo de karatsuba

Descripción del problema:


La idea del algoritmo es la siguiente:

x = x1*B^m + x0
y = y1*B^m + y0

donde x0 y y0 son menos de B^m.


El producto entonces es:
xy = (x1*B^m + x0)(y1*B^m + y0)
xy = z2*B^2m + z1*B^m + z0

donde
z2 = x1*y1
z1 = x1*y1 + x0*y1
z0 = x0*y0

Estas fórmulas requieren de cuatro multiplicaciones, y era conocido por Charles


Babbage. Karatsuba observó que x y se pueden calcular en solo tres
multiplicaciones, a costa de algunas adiciones extras. Con z0 y z2.

z1 = (x1 + x0)*(y1 + y0) – z2 –z0

Que reemplaza la expresión


z1 = x1*y1 + x0*y1

Por
z1 = (x1 + x0)*(y1 + y0) – x1*y1 –x0*y0
Programación dinámica

EL PROBLEMA DE LA DILIGENCIA

Un caza fortunas de Missouri decide irse al oeste a unirse a la fiebre del oro en
California. Tiene que hacer el viaje en diligencia através de territorios sin ley donde
existían serios peligros de ser atacados por merodeadores. Aún cuando su punto
de partida y destino eran fijos ,tenia muchas opciones en cuanto a que estados
debía elegir como puntos intermedios. Se desea estimar la ruta mas segura, como
el costo de la póliza para cualquier jornada de la diligencia esta basada en una
evaluación de seguridad del recorrido, la ruta mas segura debe ser aquella que
tenga el costo total mas barato.

¿Cuáles la ruta que minimiza el costo total de la póliza?


Algoritmos ávidos,

PROCEDURE
AlgoritmoAvido(entrada:CONJUNTO):CONJUNTO;
VAR x:ELEMENTO; solucion:CONJUNTO; encontrada:BOOLEAN;
BEGIN encontrada:=FALSE;
crear(solucion);
WHILE NOT EsVacio(entrada) AND (NOT encontrada) DO
x:=SeleccionarCandidato(entrada);
IF EsPrometedor(x,solucion) THEN
Incluir(x,solucion);
IF EsSolucion(solucion) THEN
encontrada:=TRUE END;
END
END;
RETURN solucion;
END AlgoritmoAvido;

EL PROBLEMA DEL CAMBIO

Suponiendo que el sistema monetario de un país está formado por monedas de


valores v1,v2,...,vn, el problema del cambio de dinero consiste en descomponer
cualquier cantidad dada M en monedas de ese país utilizando el menor número
posible de monedas.

a) Suponiendo que cada moneda del sistema monetario del país vale al menos el
doble que la moneda de valor inferior, que existe una moneda de valor unitario, y
que disponemos de un número ilimitado de monedas de cada valor.

b) Suponiendo que el sistema monetario está compuesto por monedas de valores


1, p, p2, p3,..., pn, donde p > 1 y n > 0, y que también disponemos de un número
ilimitado de monedas de cada valor.
Solución:

TYPE MONEDAS =(M500,M200,M100,M50,M25,M5,M1); (*sistema monetario*)


VALORES = ARRAY MONEDAS OF CARDINAL; (* valores de monedas *)
SOLUCION = ARRAY MONEDAS OF CARDINAL;
PROCEDURE Cambio(n:CARDINAL; VAR valor:VALORES;VAR cambio:SOLUCION);
(* n es la cantidad a descomponer, y el vector "valor" contiene los valores de cada
una de las monedas del sistema monetario *)
VAR moneda:MONEDAS;
BEGIN
FOR moneda:=FIRST(MONEDAS) TO LAST(MONEDAS) DO
cambio[moneda]:=0
END;
FOR moneda:=FIRST(MONEDAS) TO LAST(MONEDAS) DO
WHILE valor[moneda]<=n DO
INC(cambio[moneda]);
DEC(n,valor[moneda])
END
END
END Cambio;

El método de retroceso

En el ejemplo, para el problema de las cuatro reinas (en un tablero 4×4):

También podría gustarte