Algoritmos Avanzados
Algoritmos Avanzados
Algoritmos Avanzados
Tema 1
1.1
RESOLUCIN DE PROBLEMAS
Algoritmos Avanzados
Algoritmos Avanzados
Algoritmos Avanzados
correcta si cumple su especificacin. La dualidad tipos/algoritmos del diseo se traslada
en la implementacin a estructuras/ algoritmos. Para cada uno de los tipos de datos del
diseo, se debe elegir una estructura de datos adecuada. Por ejemplo, los dos ejemplos
de problemas analizados necesitan listas. Una lista se puede representar mediante una
variedad de estructuras: listas enlazadas con punteros o cursores, mediante celdas
adyacentes en un array, enlazadas simple o doblemente, con nodos cabecera o no, etc.
La eleccin debe seguir los criterios de eficiencia en cuanto a tiempo y a uso de
memoria que se hayan especificado para el problema. En cada caso, la estructura ms
adecuada podr ser una u otra.
1.2 ALGORITMOS
Como ya hemos visto, los algoritmos junto con las estructuras de datos constituyen los
dos elementos imprescindibles en el proceso de resolucin de problemas. Los primeros
definen el componente manipulador y los segundos el componente almacenado, y se
combinan estrechamente para crear soluciones a los problemas.
No est de ms recordar que la historia de los algoritmos es mucho anterior a la aparicin
de los ordenadores. De hecho, podramos datar la aparicin de los algoritmos al primer
momento en que los seres humanos se plantearon resolver problemas de forma genrica.
Histricamente uno de los primeros algoritmos inventados, para la resolucin de
problemas de tipo matemtico, es el algoritmo de Euclides de Alejandra, Egipto,
propuesto alrededor del ao 300 a.C. Euclides propone el siguiente mtodo para calcular
el mximo comn divisor de dos nmeros enteros.
Algoritmos Avanzados
Ejemplo 3 Algoritmo de Euclides para calcular el mximo comn divisor de dos nmeros
enteros, a y b, siendo a > b.
1. Hacer r= a mdulo b
2. Si r = 0 entonces el mximo comn divisor es b
3. En otro caso:
3.1. Hacer a= b
3.2. Hacer b= r
3.3. Volver al paso 1
Pero el honor de dar nombre al trmino algoritmo lo recibe el matemtico rabe del siglo
IX Muhammad ibn Musa al-Khwarizmi (que significa algo as como Mohamed hijo de
Moiss de Khorezm, en Oriente Medio). Sus tratados sobre la resolucin de ecuaciones
de primer y segundo grado ponen de relieve la idea de resolver clculos matemticos a
travs de una serie de pasos predefinidos. Por ejemplo, para resolver ecuaciones de
segundo grado del tipo: x2 + bx = c, define la siguiente serie de pasos7.
Ejemplo .4 Algoritmo de al-Khwarizmi para resolver la ecuacin x2 + bx = c.
Se muestra el ejemplo x2 + 10x = 39, el mismo que al-Khwarizmi utiliza en su libro Hisab
al-jabr wal-muqabala (El clculo de reduccin y restauracin), sobre el ao 825 d.C.
1. Tomar la mitad de b. (En el ejemplo, 10/2 = 5)
2. Multiplicarlo por s mismo. (En el ejemplo, 5 * 5 = 25)
3. Sumarle c. (En el ejemplo, 25 + 39 = 64)
4. Tomar la raz cuadrada. (En el ejemplo,64 = 8)
5. Restarle la mitad de b. (En el ejemplo, 8 10/2 = 8 5 = 3)
El resultado es
, expresado algortmicamente. El matemtico bagdad
es tambin considerado como el introductor del sistema de numeracin arbigo en
occidente, y el primero en usar el nmero 0 en el sistema posicional de numeracin.
Algoritmos Avanzados
Definicin 2:
Un algoritmo es un conjunto de instrucciones sencillas, claramente
especificadas, que se debe seguir para resolver un problema. Una vez
que se da un algoritmo para un problema y se decide que es correcto,
un paso importante es determinar la cantidad de recursos, como
tiempo o espacio, que requerir
DEFINICIN DE KNUTH
Una definicin ms formal de algoritmo se puede encontrar en el libro de Knuth:
Definicin 1.1 Un mtodo de clculo es una cuaterna (Q, I,W,f)
donde:
Q es un conjunto que contiene a I y W, y
f : Q Q con f(w) = w para todo w perteneciente a W.
Q es el conjunto de estados del clculo,
I es el conjunto de estados de entrada,
W es el conjunto de estados de salida y
f es la regla de clculo.
Definicin 1.2 Una secuencia de clculo es x0, x1, x2; . . . donde x0 I
y k 0 f(xk) = xk+1. La secuencia de clculo acaba en n
pasos si n es el menor entero con xn W.
Veamos cmo esta definicin formal de algoritmo (el mtodo de clculo) cumple las
propiedades que debe de cumplir un algoritmo:
Algoritmos Avanzados
No todo lo que aparece en informtica son algoritmos. Un ejemplo tpico de algo que no
es un algoritmo es un sistema operativo. El sistema operativo consta de una serie de
instrucciones, pero no se le prev una ejecucin finita, sino que debera poder ejecutarse
mientras no se requiera lo contrario.
Algoritmos deterministas y no deterministas
Segn un algoritmo produzca o no siempre los mismos valores de salida para las mismas
entradas, clasificamos los algoritmos en dos tipos:
Algoritmos deterministas. Para los mismos datos de entrada producen siempre los
mismos datos de salida.
Algoritmos no deterministas. Para los mismos datos de entrada pueden producir
diferentes salidas.
El no determinismo puede chocar un poco con la idea de definibilidad. Sin embargo,
ambas propiedades no son contradictorias. Por ejemplo, el resultado de un algoritmo
paralelo, que se ejecuta en distintos procesadores, puede depender de cuestiones de
temporizacin que no forman parte de los datos del problema. La existencia del no
determinismo hace que un algoritmo no siempre se pueda ver como una funcin en
sentido matemtico de la forma f : ENTRADA SALIDA.
Algoritmos Avanzados
Las leyes explcitamente establecidas y los supuestos tericos. Por ejemplo, las leyes
de movimiento de Newton forman parte del paradigma newtoniano y las ecuaciones
de Maxwell forman parte del paradigma que constituye la teora electromagntica
clsica.
El instrumental y las tcnicas instrumentales necesarios para hacer que las leyes del
paradigma se refieran al mundo real. La aplicacin en astronoma del paradigma
newtoniano requiere el uso de diversos telescopios, junto con tcnicas para su
utilizacin y diversas tcnicas para corregir los datos recopilados.
Un componente adicional de los paradigmas lo constituyen algunos principios
metafsicos muy generales que guan el trabajo dentro del paradigma. Todos los
paradigmas, adems, contienen prescripciones metodolgicas muy generales tales
como: "Hay que intentar seriamente compaginar el paradigma con la naturaleza".
Podemos decir que, los paradigmas son marcos de referencia que imponen reglas
sobre cmo se deben hacer las cosas, indican qu es vlido dentro del paradigma y
qu est fuera de sus lmites. Un paradigma distinto implica nuevas reglas, elementos,
lmites y maneras de pensar, o sea implica un cambio. Los paradigmas pueden ser
considerados como patrones de pensamiento para la resolucin de problemas. Desde
luego siempre teniendo en cuenta los lenguajes de programacin, segn nuestro
inters de estudio. Los paradigmas de Programacin representan un enfoque
particular o filosofa para la construccin del software. No es mejor uno que otro sino
Lic. Carmen Mollinedo
Algoritmos Avanzados
que cada uno tiene ventajas y desventajas. Tambin hay situaciones donde un
paradigma resulta ms apropiado que otro.
Generalmente los autores clasifican los paradigmas de modos similares, siempre
destacan el imperativo, el orientado a objetos, el funcional y el lgico. Algunos autores
o profesores, mencionan paradigmas heursticos, concurrentes, procedimentales,
declarativos y demostrativos.
Algoritmos Avanzados
Tema 2
2.1. INTRODUCCIN
El anlisis de algoritmos es la parte de la algortmica que estudia la forma de medir la
eficiencia de los algoritmos. Pero cundo decimos que un algoritmo es ms o menos
eficiente? Utilizando un punto de vista empresarial, podemos definir la eficiencia como la
relacin entre recursos consumidos y productos obtenidos. Se trata, por lo tanto, de una
nueva formulacin de la bien conocida ley del mnimo esfuerzo: maximizar los resultados,
minimizando el esfuerzo. Los resultados que ofrece un algoritmo pueden ser de distintos
tipos:
Un algoritmo puede resolver el problema de forma muy precisa, si es de tipo
matemtico, o garantizar el ptimo, en problemas de optimizacin, o encontrar
siempre la solucin, si es de satisfaccin de restricciones.
Otro algoritmo puede ser que slo encuentre soluciones aproximadas, o ms o
menos cercanas al ptimo, pero siempre encuentre alguna.
Finalmente, otro algoritmo puede que encuentre soluciones slo en determinados
casos, buenas o malas, y en otros casos acabe sin devolver ninguna respuesta.
Por otro lado, los recursos que consume un algoritmo pueden ser de distintos tipos. Entre
los ms importantes tenemos:
En aplicaciones distintas puede que el recurso crtico sea diferente. En la mayora de los
casos, el recurso clave es el tiempo de ejecucin, por lo que muchas veces se asocia
eficiencia con tiempo. Pero, recordemos, ni el tiempo es el nico recurso, ni el tiempo por
s solo mide la eficiencia, si no que se debe contrastar con los resultados obtenidos. En
conclusin, un algoritmo ser mejor cuanto ms eficiente sea. No obstante, el sentido
comn nos dice que habrn otros muchos criterios para decidir lo bueno que es un
algoritmo. Por ejemplo, ser importante: que sea fcil de entender y de programar, que sea
corto en su extensin, que sea robusto frente a casos extraos, que se pueda reutilizar en
otros problemas, que se pueda adaptar, etc.
Lic. Carmen Mollinedo
10
Algoritmos Avanzados
Contenido de los datos de entrada. Para un tamao de entrada fijo y bajo las
mismas condiciones de ejecucin, un algoritmo puede tardar distinto tiempo para
diferentes entradas. Hablamos de diferentes casos: mejor caso, es el contenido de
los datos de entrada que produce la ejecucin ms rpida del algoritmo (incluso para
tamaos de entrada grandes); peor caso, es el que da lugar a la ejecucin ms lenta
para un mismo tamao; caso promedio, es el caso medio de todos los posibles
valores de entrada.
Por ejemplo, en el anterior algoritmo de bsqueda secuencial, el tamao del problema viene
dado por n. No es lo mismo aplicar el algoritmo con n = 5 que con n =5.000.000. Pero la
ejecucin con n = 5.000.000 puede tardar menos que con n = 5, si el x buscado se encuentra
en la primera posicin. As pues, el mejor caso ser que a[1] = x, independientemente de lo
que valga n. El peor caso ser que x no se encuentre en el array, con lo cual la bsqueda
Lic. Carmen Mollinedo
11
Algoritmos Avanzados
acabar al llegar a a[n + 1]. El caso promedio sera la media de todas las posibles entradas.
Supongamos que x est en a con probabilidad p y que, en caso de estar, todas las posiciones
tienen la misma probabilidad. Entonces se recorrern n/2 posiciones con probabilidad p, y
n+ 1 posiciones con probabilidad 1 p.
En resumen, para la estructura repetitiva el Tiempo de Ejecucin depende de los valores
que toman x y n
Mejor caso. Se encuentra x en la 1 posicin:
Tiempo(N) = 1
Peor caso. No se encuentra x:
Tiempo(N) =N
Existen dos enfoques para medir la eficiencia:
Enfoque emprico o a posteriori: Consiste en programar todos los algoritmos candidatos e
ir probndolos en distintos casos con ayuda de una computadora.
Enfoque terico o a priori. Que consiste en determinar matemticamente la cantidad de
recursos necesarios para cada uno de los algoritmos como funcin del tamao de los casos
considerados. Lo recursos que ms nos interesan son el tiempo de computacin y el espacio
de almacenamiento.
12
Algoritmos Avanzados
Ejemplo 3
a) z=z+1
b) a>b
Tienen un T(n)=1, donde n es el tamao (no conocido en este ejemplo) de la entrada
2.5 NOTACIONES PARA EXPRESAR LA COMPLEJIDAD EN TIEMPO
Una medida asinttica es un conjunto de funciones que muestran un comportamiento
similar cuando los argumentos toman valores muy grandes. Las medidas asintticas se
definen en trminos de una funcin de referencia f.
T(n) tiempo de ejecucin de un programa con una entrada de tamao n
Notacin () Una funcin T(n) es (g(n)) s y solo s existen unas constantes c y n0 tales
que cg(n) T(n) cuando n0n
Notacin () Una funcin T(n) es (h(n)) s y solo s se cumple que existen unas constantes
positivas c1, c2 y n0 independientes de n tales que:
c1g(n) T(n) c2g(n) n0n
13
Algoritmos Avanzados
Notacin O(): De manera formal se dice que una funcin f(n) es de orden O(g(n)) sii se
cumple que existen unas constantes positivas c y n0 , ambas independientes tales que:
f(n) c g(n) , n n0
donde decidir que f(n) es O(g(n)) supone que cg(n) es una cota superior del tiempo de
ejecucin del algoritmo
Las notaciones se interpretan tambin de la siguiente forma:
O(T): Orden de complejidad de T.
(T): Orden inferior de T, u omega de T.
(T): Orden exacto de T.
14
Algoritmos Avanzados
Ejemplo 4
Sea el segmento de algoritmo
For i=1 to 10 do
Begin
x=x+1 ..............1
y=y/i.................1
end
T(n)=T(for)*T(instrucciones internas del for)=10*2=12 por la propiedad de la
multiplicacin y es O(1) por Pr 2
donde:
O(1) O(log n) O(n ) O(n) O(n log n) O(n2) O(n3) ... O(nk)
...O(2n ) O(n!)
2.6 ANLISIS DE ALGORITMOS
A continuacin se enumeran algunas reglas importantes para el anlisis de programas.
a) Ciclos for
El tiempo de ejecucin de un ciclo for, es a lo ms el tiempo de ejecucin de las
instrucciones que estn en el interior del ciclo for (incluyendo las condiciones), por el
nmero de iteraciones. Generalmente se usa el smbolo de sumatoria
Ejemplo 5
for i:=1 to n do
x:=x+1;
15
Algoritmos Avanzados
n
Ejemplo 6
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
x:=x+1;
n n
n n n n
Ta ( n) = T(for_i) * T(for_j) * T(for_k) * 1 = 1 = n = (n * n ) = n * n * n = n 3
i =1 j =1 k =11
i =1 j =1
i =1
c) Para If / Else
T(IF_THEN) = T(condicin)+T(Then)
T(IF_THEN_ELSE) = T(condicin)+max(T(Then),T(Else))
Ejemplo 7
i)
if N mod 2 = 0 then
for i:=1 to n do
x:=x+1;
ii)
if N> 0 then
x:=x+N;
else
Ta(n)= T(if_then)=T(condicin)+T(then)
n
= 1 + 1 = 1 + n es O(n)orden lineal
i =1
Tb(n)= T(if_then_else)
= T(condicin)+max(T(then),T(else))
= 1 + max(1,2) = 1 + 2 = 3
es O(1)orden lconstante
16
Algoritmos Avanzados
begin
N=N+100
Z=z+N
Endlse
La nocin de esta estructura selectiva se puede extender al uso del CASE (seleccin
mltiple)
d) While
Se realiza generalmente un anlisis inductivo exhaustivo mediante una variable axiliar t
cuya misin es contar el tiempo del while. Adems se realiza el anlisi del peor de los casos
de entrada al bucle.
Ejemplo 8
Cuntas multiplicaciones realiza el siguiente algoritmo para calcular potencias, en el peor
de los casos?
Funcion potencia1(y : num; z : nat): nat
p := 1
1
mientras z > 0 hacer
p := p * y
1
z := z 1
1
z+1
fmientras
funcin
Analizando solamente la sentencia mientras se tiene
t=0
mientras z > 0 hacer
z = z -1
t = t +1
z
4
3
2
1
0
t
0
1
2
3
4
Finalmente:
Tpotencia1(z) = 1 + (z+1)2 = 1 + 2z + 2 = 3 + 2z que es O(z) orden lineal
17
Algoritmos Avanzados
a) 1 = n
i =1
n
b) 1 = (n a + 1).
i=a
n
c ) i =
i =1
n(n + 1)
.
2
d ) i 2 =
i =1
n
e) i r =
i =1
n(n + 1)(2n + 1)
6
n r +1
(r + 1) + p r (n)
18
Algoritmos Avanzados
Mediante la notacin asinttica, obtnganse los tiempos de ejecucin del peor caso
supuesto para cada uno de los procedimientos siguientes como una funcin de n
Ejercicio 1
i:=1;
while I<= n do
begin
x:=x+1;
I:=I+1;
End
Aadiendo una variable t que controlar el nmero de veces que se ingresa a la estructura
while
T=0
i:=1;
while i<= n do
i:=i+1;
t = t +1
i
1
2
3
4
5
t
0
1
2
3
4
n
4
Ejercicio 3
procedure pord_mat(n: integer);
var
I,j,k:integer;
Begin
For i:=:1 to n do
Lic. Carmen Mollinedo
19
Algoritmos Avanzados
For j:=1 to n do
begin
C[i,j]:=0; - - - - - - - - - - - - - - 1
For k:=1 to n do
C[i,j]:=C[i,j]+A[i,k] * B[k,j]: - - 1
End;
End;
n n
k=1
n 1
n 1
n 1
i =1
j =i +1
i =1
j =1
j =1
Tmisterio1 (n ) = ( ( 1)) = ( j ) = ( j j )
i =1
n 1
Tmisterio1 (n ) = (
i =1
Tmisterio1 (n ) =
j =i +1 k =1
n( n + 1) i (i + 1) n 1 n ( n + 1) 1 n 1 2
) = (
) (i + i )
2
2
2
2 i =1
i =1
( n 1)n (n + 1) 1 n 1 2 n1
( n 2 n )( n + 1) 1 (n 1)n (2n 1) ( n 1)n
( i + i ) =
(
+
)
2
2 i =1
2
2
6
2
i =1
20
Algoritmos Avanzados
begin
cuenta:=0;
x:=2;
while x<n do
begin
x:=2*x;
cuenta:=cuenta+1;
end;
writeln (cuenta)
end;
Primero analizamos la sentencia WHILE
t=0
x=2
while x<n do
x=2*x
t=t+1
x
2
4
8
16
32
t
0
1
2
3
4
n
31 El tiempo del mientras (while) es:
2t+1 = x de la condicin del while 2t+1 < n
despejando t se tiene
t <log2n 1
para que se de una equivalencia entre ambos trminos
t +a log2n 1 t log2n 1 a +1
se adiciona la ctte 1 debido a la ltima pregunta que se
realiza en la sentencia while
Finalmente:
Ejercicio 6
Se tiene un fragmento de programa sencillo para calcular i3 a continuacin:
Function suma(n:intertger)
var
i,suma_parcial: integer
begin
(1) suma_parcial=0;
21
Algoritmos Avanzados
Tsuma(n) = 1+ 1 + 1
i=1
Expansin de recurrencias
Utilizar la recurrencia misma para sustituir m<n por cualquier T(m) en la derecha, hasta
que todo, los trminos T(m) par m>1 se hayan reemplazado por formulas que impliquen
solo T(1) como T( 1) siempre es constante, so tiene una formula para T(n) en funcin de n
y de algunas constantes
2.-
Suponer una solucin f(n) y usar la recurrencia para mostrar que T(n)<=f(n). Algunas veces
solo se supone la forma f(n) dejando algunos parmetros sin especificar. y deduciendo
valores adecuados para los parmetros al intentar demostrar que T(n)<=f(n) para todo n.
3.-
n= 1
( *)T(n) =
aT(n/b)+d(n) n>=2
Donde
22
Algoritmos Avanzados
Una vez que se resuelve por expansion de recurrencias, se obtiene los siguientes tres casos:
CASO I
CASO II
CASO Ill:
23
Algoritmos Avanzados
Segunda forma
c
TFactorial (n) =
T ( n-1) + d
n=1
1
TFactorial (n) =
T ( n-1) + 1
n>1
n=1
n>1
(*)
Por ltimo, el caso base se presenta cuando el argumento de la funcin T(n) es 1 es decir
para T(1), entonces:
n-k=1 => k=n 1
luego se reemplaza k en (*)
T(n) = T(n (n-1)) + (n-1)*d = T(1) + (n-1)*d
T(n) = c + dn d
que es O(n) orden lineal
24
Algoritmos Avanzados
n= 1
T(n)=
2T(n/2)+ cn
n<1
n
T(n) = 2T + cn
2
n
n n
T = 2T 2 + c
2
2 2
n
n n
T 2 = 2T 3 + c 2
2
2 2
Realizando repetidos reemplazos en T(n)
n
T(n) = 2T + cn
2
n n
n
n
n
n
n
T(n) = 2 2T 2 + c + cn = 2 2 T 2 + 2c + cn = 2 2 T 2 + 2c + cn = 2 2 T 2 + 2cn
2
2
2
2
2
2 2
n n
T(n) = 2 2 2T 3 + c 2
2 2
n
3 n
2 n
3 n
+ c + cn = 2 T 3 + 2 c 2 + 2cn = 2 T 3 + 3cn
2
2
2
2
n
= 1 n = 2 k k = log n n
k
2
Reemplazando el valor de k en el patron de recurrencia:
25
Algoritmos Avanzados
es O(nlogn)orden cuasilineal
Ejercicio 3. Obtngase Ia cota 0 mayscula de la siguiente recurrencia:
T(n)=
T ( n )= 2T ( n/2)+2
Para n/2
T(n) = 2[2T(n/4)+2]+2
para n/4
T(n/4) = 2T(n/8)+2
T(n)=2*2T(n/8)+8+4+2
El patron de recurrencia ser
T (n ) = 2 k T ( n
) + 2 i 2
i =1
Si n=2t
T (n) = 2 k T (2
i
k ) + 2
i =1
T (n) = 2 t 1 T (2
t 1
i
t 1 ) + 2 =
i =1
t 1
2t
T ( 2) + 2 i
2
i =1
S = 2i = 2t 2
i =1
26
Algoritmos Avanzados
Ejercicio 4
C
n=1
2T(n/2) +
n3 e.o.c.
T(n) =
Respuesta:
Mediante la tcnica de "anlisis de expansin" o Expansin de Recurrencias,
reemplazamos sobre T(n) de la siguiente forma:
n
T ( n ) = 2T ( ) + n 3
2
3
n n 3
n
3
2 n
T ( n ) = 2 2T 2 + + n = 2 T 2 + 2 + n 3
2 2
2 2
3
3
3
n n 3
n
n
n
n
T ( n ) = 2 2 2T 3 + 2 + 2 + n 3 = 2 3 T 3 + 2 2 2 + 2 + n 3
2 2
2
2
2
2
3
k 1
k 1
2i
n k 1 i n
k n
i n
k n
3
T (n) = 2 T k + 2 i = 2 T k + 2 i 3 = 2 T k + n i 3
2 i =0 2
2 i =0 2
2
i =0 2
k
2 k 1 1
3 = 2 =S
i =0 2
i =0 2
1 1
1
1
S = 1 + + 2 + ......... + k 2 + k 1
4 4
4
4
1
1 1
1
1
S = + 2 + ......... + k 1 + k
4
4 4
4
4
1
1
S (1 ) = 1 k
4
4
4
1
S=
3 3.4 K 1
27
Algoritmos Avanzados
(Caso II)
28
Algoritmos Avanzados
Tema 3
23
Algoritmos Avanzados
tambin un tipo de datos. El tamao de todos los tipos de datos depende de la
mquina y del compilador sobre los que se trabaja.
En principio, conocer la representacin interna de estos tipos de datos no es necesaria
para realizar un programa, pero s puede afectar en algunos casos al rendimiento.
Por otra parte es posible definir otros tipos de estructuras de datos compuestos, entre
las cuales se encuentran los arreglos, registros y otros.
Tipos predefinidos
o
proporcionados por el LP
o
slo nos preocupamos de su uso
Las estructuras de datos que trataremos aqu son los arrays, las pilas y las colas, los
rboles, y algunas variantes de estas estructuras.
24
Algoritmos Avanzados
Los tipos abstractos de datos (TAD) permiten describir una estructura de datos en
funcin de las operaciones que pueden efectuar, dejando a un lado su implementacin.
Los TAD mezclan estructuras de datos junto a una serie de operaciones de
manipulacin. Incluyen una especificacin, que es lo que ver el usuario, y una
implementacin (algoritmos de operaciones sobre las estructuras de datos y su
representacin en un lenguaje de programacin), que el usuario no tiene necesariamente
que conocer para manipular correctamente los tipos abstractos de datos.
Se caracterizan por el encapsulamiento. Es como una caja negra que funciona
simplemente conectndole unos cables. Esto permite aumentar la complejidad de los
programas pero manteniendo una claridad suficiente que no desborde a los
desarrolladores. Adems, en caso de que algo falle ser ms fcil determinar si lo que
falla es la caja negra o son los cables.
Por ltimo, indicar que un TAD puede definir a otro TAD. Por ejemplo, en prximos
apartados se indicar como construir pilas, colas y rboles a partir de arrays y listas
enlazadas. De hecho, las listas enlazadas tambin pueden construirse a partir de arrays y
viceversa.
3.2 RECURSIVIDAD
La recursin es una tcnica para resolver problemas. Muchas veces resulta ms fcil
desarrollar un algoritmo recursivo que uno iterativo.
Definicin: Una funcin f es recursiva si en su cuerpo contiene
una aplicacin de f, es decir, si se puede activarse a si misma.
25
Algoritmos Avanzados
Ejemplo
La funcin Factorial puede ser desarrollada iterativamente o recursivamente1.
si n = 0 1
si n > 1
Prueba
Para N=5
Llamadas recursiva
Factorial(5)=factorial(4)*5
Factorial(4)=factorial(3)*4
Factorial(3)=factorial(2)*3
Factorial(2)=factorial(1)*2
Factorial(1)=1
Evaluacin de resultados
Factorial(1)=1
Factorial(2)=factorial(1)*2 =
Factorial(3)=factorial(2)*3 =
Factorial(4)=factorial(3)*4 =
Factorial(5)=factorial(4)*5 =
1*2 =2
2*3 =6
6*4 =24
24*5 =120
26
Algoritmos Avanzados
Expresin funcional
si n = 1 2
1
fib(n) =
fib(n 1) + fib(n 2) si n > 2
Codificacin
Private
Integer
Function
fibonacci(ByVal
As
Integer)
As
If n = 0 Or n = 1 Then
fibonacci = 1
Else
fibonacci = fibonacci(n - 1) + fibonacci(n 2)
End If
End Function
27
Algoritmos Avanzados
28
Algoritmos Avanzados
Prueba
Para fib(5) se tienen las siguientes entradas y salidas.
Llamadas recursiva
Fibonacci(5)=fibonacci(4)+ fibonacci(3)
Fibonacci(4)=fibonacci(3)+ fibonacci(2)
Fibonacci(3)=fibonacci(2)+ fibonacci(1)
Fibonacci(2)=1
Fibonacci(1)=1
Evaluacin de resultados
Fibonacci(1)=1
Fibonacci(2)=1
Fibonacci(3)=fibonacci(2)+ fibonacci(1)=1+1=2
Fibonacci(4)=fibonacci(3)+ fibonacci(2)=2+1=3
Fibonacci(5)=fibonacci(4)+ fibonacci(3)=3+2=5
En este caso se puede observar que la solucin planteada de fibonacci es impracticable para
valores de n grandes. Cada fibonacci() realiza dos llamadas, por lo que el nmero de
llamadas aumenta en proporcin geomtrica.
Print c
a = b
b = c
Next i
fiboRec = c
EL lector podr verificar la eficiencia de la versin recursiva con respecto de la iterativa
29
Algoritmos Avanzados
A * B = Multi( A, B) = i =1 A = i =1 A + A
B
Es decir A*B se puede expresar como la sumatoria desde 1 hasta B de A, lo cual si se saca
de la expresin al ltimo termino, el resto continua siendo sumatoria.
El caso base es mucho ms simple, nos preguntamos cul es el valor ms qequeo que
puede toma B, para que el resultado sea trivial, es posible elegir entre las siguientes
alternativas
A*B=A
cuando B=1
A*B=0 cuando B=0
Expresin funcional
si B = 1
A
Multi( A, B) =
Multi( A, B 1) + A
si B > 1
Algoritmo
Private Function multiplica(ByVal A As Integer, ByVal
B As Integer) As Integer
If B = 1 Then
multiplica = A
Else
multiplica = multiplica(A, B - 1) + A
End If
End Function
30
Algoritmos Avanzados
Codificacin completa
Option Explicit
Dim num As Integer
Dim num2 As Integer
Private Function multiplica(ByVal A As Integer, ByVal B As Integer)
As Integer
If B = 1 Then
multiplica = A
Else
multiplica = multiplica(A, B - 1) + A
End If
End Function
Private Sub Command1_Click()
num = Val(Text1.Text)
num2 = Val(Text2.Text)
MsgBox "El resulatdo es " & multiplica(num, num2), vbCritical,
"RESULTADO"
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 13
Text2.SetFocus
Case Asc(0) To Asc(9)
Case Else
KeyAscii = 0
End Select
End Sub
31
Algoritmos Avanzados
End Sub
Ejercicio 2 intercalar los dgitos de dos nmeros, los nmeros tiene la misma longitud.
Solucin
La funcin modulo nos permite sacar el ltimo digito de cada nmero y componer un
nuevo numero, cuando numA y numB sean de un solo dgito, es decir menores a 10 se
habr llegado al caso base.
Expresin funcional
si A < 10 B < 10
A *10 + B
Intercala( A, B) =
Intercala( Adiv10, Bdiv10) * 100 + ( A mod 10) * 10 + ( B mod 10) eoc
Algoritmo
Private Function intercala(ByVal numA As Integer, ByVal
numB As Integer) As Double
Dim ma As Integer, mb As Integer, nuevoNum As Integer
If numA < 10 Then
intercala = numA * 10 + numB
Else
ma = numA Mod 10
mb = numB Mod 10
nuevoNum = ma * 10 + mb
intercala = intercala(numA \ 10, numB \ 10) * 100 +
nuevoNum
End If
32
Algoritmos Avanzados
Prueba
Intercala(345,796) = Intercala(34,79)*100 + 56 =3749*100 + 56 = 374956
Intercala(34,79)
Intercala(3,7)
Algoritmo
Private Function sumaPares(n As Integer)
If n = 1 Then
sumaPares = 2
Else
sumaPares = sumaPares(n - 1) + 2 * n
End If
End Function
Codificacin completa
33
Algoritmos Avanzados
Option Explicit
Dim num As Integer
Private Function sumaPares(ByVal n As Integer) As Integer
If n = 1 Then
sumaPares = 2
List1.AddItem 2
Else
sumaPares = sumaPares(n - 1) + 2 * n
List1.AddItem (2 * n)
End If
End Function
34
Algoritmos Avanzados
Ejercicio 4 Dado un nmero entero generar otro nmero solo compuesto por los nmeros
naturales.
Ejemplo:
N=1
genera 1
N=2
genera 12
N=3
genera 123
Expresin funcional
si n = 1
1
Genera(n) =
Genera(n 1) *10 + n si n > 1
Algoritmo
Prueba
Para n=5
Llamadas recursiva
genera(5) = genera(4) * 10 + 5
genera(4) = genera(3) * 10 + 4
genera(3) = genera(2) * 10 + 3
genera(2) = genera(1) * 10 + 2
genera(1) = 1
Evaluacin de resultados
genera(1) = 1
genera(2) = genera(1) * 10 + 2 = 1*10+2 = 12
genera(3) = genera(2) * 10 + 3 = 12*10+3=123
genera(4) = genera(3) * 10 + 4 = 123*10+4=1234
genera(5) = genera(4) * 10 + 5 = 1234*10+5=
.....................12345
fi
1 2 3 4 5 6 7
35
Algoritmos Avanzados
Algoritmos Avanzados
3.3 ARREGLOS
Supongamos que nos enfrentamos a un problema como este: Una empresa que cuenta con
150 empleados, desea establecer una estadstica sobre los salarios de sus empleados, y
quiere saber cual es el salario promedio, y tambin cuantos de sus empleados gana entre
$1250.00 y $2500.00.
Si tomamos la decisin de tratar este tipo de problemas con datos simples, pronto nos
percataramos del enorme desperdicio de tiempo, almacenamiento y velocidad. Es por eso
que para situaciones de este tipo la mejor solucin son los datos estructurados.
Lic. Carmen Mollinedo
37
Algoritmos Avanzados
Un arreglo puede definirse como un grupo o una coleccin finita, homognea y ordenada
de elementos. Los arreglos pueden ser de los siguientes tipos:
o De una dimensin.
o De dos dimensiones.
o De tres o ms dimensiones
3.4 PILAS
Una pila (stack) es una coleccin ordenada de elementos en la cual se
pueden insertar nuevos elementos por un extremo y se pueden retirar otros
por el mismo extremo; ese estremos se llama ``la parte superior'' de la
pila.
Si tenemos un par de elementos en la pila, uno de ellos debe estar en la parte superior de la
pila, que se considera ``el ms alto'' en la pila que el otro. En la figura 3.1 el elemento F es
el ms alto de todos los elementos que estn en la pila. El elemento D es el ms alto de los
elementos A,B,C, pero es menor que los elementos E y F.
38
Algoritmos Avanzados
Para describir cmo funciona esta estructura, debemos agregar un nuevo elemento, el
elemento G. Despus de haber agregado el elemento G a la pila, la nueva configuracin es
la que se muestra en la figura 3.2
39
Algoritmos Avanzados
40
Algoritmos Avanzados
En la figura 3.4 se muestra una actividad tpica de la cola, en donde se muestra que se
agregan datos por la parte trasera de la cola y se eliminana datos por el frente de la cola.
Si Q es una cola y x es un elemento, se pueden hacer tres operaciones bsicas con las colas:
o insert(Q,x), que inserta el elemento x en la parte trasera de la cola Q.
o x=remove(Q), que almacena en x el valor del elemento retirado de la parte
frontal de la cola Q.
o empty(Q), que es un predicado de valor booleano, y es true cuando la cola Q
tiene 0 elementos, y es false cuando la cola Q tiene al menos un elemento, en
cuyo caso, ese nico elemento es la parte frontal y la parte trasera de la cola
al mismo tiempo.
Tericamente no hay lmite para el tamao de la cola, asi que siempre se debera poder
insertar elementos a una cola, sin embargo, al igual que las pilas, normalmente se deja un
espacio de memoria para trabajar con esta estructura. Por el contrario, la operacin remove
solamente se puede hacer si la cola no est vaca.
3.6 LISTAS
Una lista es una estructura de datos secuencial.
41
Algoritmos Avanzados
El campo liga, que es de tipo puntero, es el que se usa para establecer la liga con el
siguiente nodo de la lista. Si el nodo fuera el ltimo, este campo recibe como valor
NIL (vaco).
A continuacin se muestra el esquema de una lista :
3.7 RBOLES
3.7.1 RBOLES BINARIOS
A los rboles ordenados de grado dos se les conoce como rboles binarios ya que cada
nodo del rbol no tendr ms de dos descendientes directos. Las aplicaciones de los
rboles binarios son muy variadas ya que se les puede utilizar para representar una
estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos.
3.7.1.1 Representacin
42
Algoritmos Avanzados
B. Distinto.
B. Similares.
B. Equivalentes.
B. Completos.
A continuacin se har una breve descripcin de los diferentes tipos de rbol binario
as como un ejemplo de cada uno de ellos.
a. A. B. DISTINTO
Se dice que dos rboles binarios son distintos cuando sus estructuras son
diferentes. Ejemplo:
b. A. B. SIMILARES
Dos rboles binarios son similares cuando sus estructuras son idnticas, pero la
informacin que contienen sus nodos es diferente. Ejemplo:
43
Algoritmos Avanzados
c. A. B. EQUIVALENTES
Son aquellos rboles que son similares y que adems los nodos contienen la
misma informacin. Ejemplo:
d. A. B. COMPLETOS
Son aquellos rboles en los que todos sus nodos excepto los del ultimo nivel, tiene dos
hijos; el subrbol izquierdo y el subrbol derecho.
3.7.1.3 Recorrido de un Arbol Binario
Hay tres manera de recorrer un rbol : en inorden, preorden y postorden. Cada una
de ellas tiene una secuencia distinta para analizar el rbol como se puede ver a
continuacin:
INORDEN
Recorrer el subarbol izquierdo en inorden.
Examinar la raz.
Recorrer el subarbol derecho en inorden.
PREORDEN
Examinar la raz.
Recorrer el subarbol izquierdo en preorden.
recorrer el subarbol derecho en preorden.
POSTORDEN
Recorrer el subarbol izquierdo en postorden.
Recorrer el subarbol derecho en postorden.
Examinar la raz.
A continuacin se muestra un ejemplo de los diferentes recorridos en un rbol
binario.
Inorden: GDBHEIACJKF
Preorden: ABDGEHICFJK
Postorden: GDHIEBKJFCA
44
Algoritmos Avanzados
45
Algoritmos Avanzados
46
Algoritmos Avanzados
Los vrtice de un grafo pueden usarse para representar objetos. Los arcos se utilizan para
representar relaciones entre estos objetos.
Las aplicaciones ms importantes de los grafos son las siguientes:
47
Algoritmos Avanzados
o
o
o
o
o
o
o
CAMINO.Es una secuencia de vrtices V1, V2, V3, ... , Vn, tal que cada uno de estos V1->V2,
V2->V3, V1->V3.
LONGITUD DE CAMINO. Es el nmero de arcos en ese camino.
CAMINO SIMPLE. Es cuando todos sus vrtices, excepto tal vez el primero y el ltimo son
distintos.
CICLO SIMPLE. Es un camino simple de longitud por lo menos de uno que empieza y termina en
el mismo vrtice.
ARISTAS PARALELAS. Es cuando hay ms de una arista con un vrtice inicial y uno terminal
dados.
GRAFO CICLICO. Se dice que un grafo es cclico cuando contiene por lo menos un ciclo.
GRAFO ACICLICO. Se dice que un grafo es aciclco cuando no contiene ciclos.
GRAFO CONEXO. Un grafo G es conexo, si y solo si existe un camino simple en cualesquiera dos
nodos de G.
GRAFO COMPLETO FUERTEMENTE CONEXO.Un grafo dirigido G es completo si para
cada par de nodos (V,W) existe un camino de V a W y de W a V (forzosamente tendrn que
cumplirse ambas condiciones), es decir que cada nodo G es adyacente a todos los dems nodos de G.
GRAFO UNILATERALMENTE CONEXO.Un grafo G es unilateralmente conexo si para cada
par de nodos (V,W) de G hay un camino de V a W o un camino de W a V.
GRAFO PESADO ETIQUETADO. Un grafo es pesado cuando sus aristas contienen datos
(etiquetas). Una etiqueta puede ser un nombre, costo un valor de cualquier tipo de dato. Tambin a
este grafo se le denomina red de actividades, y el nmero asociado al arco se le denomina factor de
peso.
VERTICE ADYACENTE. Un nodo o vrtice V es adyacente al nodo W si existe un arco de m a n.
GRADO DE SALIDA.El grado de salida de un nodo V de un grafo G, es el nmero de arcos o
aristas que empiezan en V.
GRADO DE ENTRADA.El grado de entrada de un nodo V de un grafo G, es el nmero de aristas
que terminan en V.
NODO FUENTE.Se le llama as a los nodos que tienen grado de salida positivo y un grado de
entrada nulo.
NODO SUMIDERO.Se le llama sumidero al nodo que tiene grado de salida nulo y un grado de
entrada positivo.
3.8.2
EJEMPLOS DE GRAFOS
081.- Grafo regular: Aquel con el mismo grado en todos los vrtices. Si ese grado es k lo
llamaremos k-regular.
Por ejemplo, el primero de los siguientes grafos es 3-regular, el segundo es 2regular y el tercero no es regular
48
Algoritmos Avanzados
2.- Grafo bipartito: Es aquel con cuyos vrtices pueden formarse dos conjuntos
disjuntos de modo que no haya adyacencias entre vrtices pertenecientes al mismo conjunto
Ejemplo.- de los dos grafos siguientes el primero es bipartito y el segundo no lo es
3.- Grafo completo: Aquel con una arista entre cada par de vrtices. Un grafo completo con
n vrtices se denota Kn.
A continuacin pueden verse los dibujos de K3, K4, K5 y K6
Todo grafo completo es regular porque cada vrtice tiene grado |V|-1 al estar conectado con
todos los otros vrtices.
Un grafo regular no tiene por qu ser completo.
49
Algoritmos Avanzados
4.- Un grafo bipartido regular se denota Km,n donde m, n es el grado de cada conjunto
disjunto de vrtices.
A continuacin ponemos los dibujos de K1,2, K3,3, y K2,5
50
Algoritmos Avanzados
51
Algoritmos Avanzados
El nmero de subejemplares l suele ser pequeo e independiente del caso particular que
haya que resolverse.
Tiene que ser posible descomponer el caso en subcasos y recomponer las soluciones
parciales de forma eficiente.
Los subcasos deben ser en lo posible aproximadamente del mismo tamao.
En la mayora de los algoritmos de DV el tamao de los l subcasos es
aproximadamente m/b, para alguna constante b, en donde m es el tamao del caso
(o subcaso) original (cada subproblema es aproximadamente del tamao 1/b del
problema original).
4.1.2 COMPLEJIDAD
50
Algoritmos Avanzados
Sea g(n) el tiempo requerido por DV en casos de tamao n, sin contar el tiempo necesario
para llamadas recursivas. El tiempo total t(n) requerido por este algoritmo de divide y
vencers es parecido a:
t(n) = l t(n/b) + nk para 1 l y 2 b
4.1.3. EJEMPLOS
Estudiaremos el ejemplo del clculo del mximo y mnimo de los elementos almacenados
en un array. Este ejemplo es muy sencillo y slo tiene inters para hacer un estudio
detallado de los tiempos de ejecucin.
a) Mtodo directo
Un algoritmo para resolver el problema sin aplicar la tcnica divide y vencers puede
ser:
Clculo del mximo y mnimo, mtodo directo, compilado en Delphi 5
PROCEDURE MaxMin(a:TVector ;VAR max,min:integer);
VAR
i:INTEGER;
BEGIN
max := a[1];
min := a[1];
FOR i := 2 TO n DO
BEGIN
IF a[i] < min THEN
min := a[i];
Lic. Carmen Mollinedo
51
Algoritmos Avanzados
52
Algoritmos Avanzados
donde 2>20
entonces
T(n) es ( n log 2 2 ) ( n)
Sea T[1..n] un arreglo ordenado por orden no decreciente, esto es, T[i] T[ j], siempre que
1 i j n.
Sea x un elemento que no necesariamente se encuentra en T. El problema consiste en buscar
en que posicin se encuentra x en el arreglo T, si es que se encuentra.
Formalmente, se desea encontrar el ndice i tal que 1 i n+1
La aproximacin evidente es examinar secuencialmente el arreglo hasta que se encuentre el
elemento buscado o hasta llegar al final del arreglo, sin embargo el lector podr observar
que esta es la alternativa ms costosa, puesto que en el peor de los casos.
Indudablemente la Bsqueda Binaria es ms beneficiosa. En la siguiente figura buscamos el
nmero 25
53
Algoritmos Avanzados
Ini
fin
medio x
1
5
5
6
8
8
6
6
4
6
6
25
54
Algoritmos Avanzados
El algoritmo DV es el siguiente:
Anlisis
55
Algoritmos Avanzados
donde 1=20
entonces
Algoritmo
void BooleDV(int m[][20], int ini, int fin, int col)
{int medio,i;
if(ini==fin-1) { m[ini][col]=0; m[fin][col]=1;}
else
{
56
Algoritmos Avanzados
medio=(ini+fin)/2;
for(i=ini;i<=medio;i++) m[i][col]=0;
for(i=medio+1;i<=fin;i++) m[i][col]=1;
BooleDV(m,ini,medio,col+1);
BooleDV(m,medio+1,fin,col+1);
}
}
Ejemplo 4 ORDENACIN
Sea T[1..n] un arreglo de n elementos. El problema consiste en ordenar estos elementos por
orden ascendente.
Posibles soluciones:
Ordenacin por seleccin
Ordenacin por insercin
Los algoritmos que ordenan por seleccin o por insercin requieren un tiempo que est en
(n2) para el caso peor.
Dos algoritmos de ordenacin que siguen la estrategia divide y vencers son la
ordenacin por fusin (mergesort) y la ordenacin rpida (quicksort).
a) ORDENACIN POR FUSIN
Se divide el arreglo T en dos partes de tamao aproximadamente igual, se ordenan
recursivamente las dos partes y despus se fusionan las dos partes ordenadas cuidando
de mantener el orden.
En la siguiente figura se puede apreciar el proceso para ordenar un vector T
57
Algoritmos Avanzados
Algoritmo
while((i<=ta)&&(j<=tb))
{
if(a[i]<b[j]) { c[k]=a[i]; i++; k++; }
else { c[k]=b[j]; j++; k++;}
}
if(i<=ta) for(h=i;h<=ta;h++)
c[k]=a[h]; k++;
else for(h=j;h<=tb;h++)
c[k]=b[h]; k++;
}
Para realizar la copia en los subvectores
void copiav(int a[],int ini,int fin,int b[])
{int j=ini;
for(int i=1;i<=(fin-ini)+1;i++)
{
b[i]=a[j];
j++;
Lic. Carmen Mollinedo
58
Algoritmos Avanzados
}
}
Anlisis
Entonces tenemos:
T(n) = T(n/2) + T(n/2) + n/2+n/2+n
Tiempo para
ordenar
el primer
subarreglo
Tiempo para
ordenar
el segundo
subarreglo
Tiempo para
copiar en los
subvectores A
yB
Tiempo para
ejecutar el
modulo UNE
Para:
T(n) = 2T(n/2)+ 2n + d cuando n>1, d es ctte
El problema se divide en dos
2 llamadas recursiva
aplicando la frmula general tenemos:
l=2
b=2
k=1
donde 2=21
entonces
59
Algoritmos Avanzados
A continuacin, el arreglo se parte a ambos lados del pivote: se desplazan los elementos de
tal manera que los que sean mayores que el pivote queden a su derecha, mientras que los
dems (menores o iguales) quedan a su izquierda.
Enseguida, las partes del arreglo a ambos lados del pivote se ordenan independientemente
mediante llamadas recursivas del algoritmo. El resultado final es un arreglo ordenado.
Idealmente, para que los dos subcasos tuvieran aproximadamente el mismo tamao, el
pivote debera ser la mediana del arreglo. Sin embargo, encontrar la mediana requiere un
tiempo excesivo, por lo que nos limitaremos a utilizar como pivote un elemento arbitrario
del arreglo.
Supongamos que se descompondr el subarreglo T[i..j] usando como pivote a p=T[i] (el
primer elemento). Para hacerlo se recorre el arreglo una sola vez empezando por los
extremos. Los punteros k y l se inicializan en i y j+1, respectivamente. A continuacin, se
incrementa el puntero k hasta que T[k] > p (el primer elemento mayor que el pivote) y se
decrementa el puntero l hasta que T[l] p (el ltimo elemento no mayor que el pivote).
Despus se intercambian T[k] y T[l]. Este proceso contina mientras k < l. Finalmente se
intercambian T[i] y T[l] para poner el pivote en su posicin correcta.
60
Algoritmos Avanzados
Anlisis
Tiempo para
ordenar
el subarreglo
vaco = 0
T(0) +
T(n-1)
Tiempo para
ordenar
el segundo
subarreglo
n-1
Tiempo para
ejecutar el
mdulo
PARTICIN
Para:
T(n) = T(n-1) + n-1 es O(n2)
a11 a12
a12
b11 b12
b12
61
Algoritmos Avanzados
Tales que
c11 = m1 + m4 - m5 + m7
c12 = m3 + m5
c21 = m2 + m4
c22 = m1 + m3 - m2 + m6
4.1.4
PROBLEMAS RESUELTOS
Solucin:
Haremos un procedimiento al que mandaremos los ndices del array sobre los que
estamos trabajando, y dos valores max1 y max2 que contendrn el mximo y el
segundo mayor.
M y m sern variables pues hay que devolverlos al procedimiento que los llam para
combinarlos:
procedure maximos(ini, fin: enteros; var ;max1, max2: datos)
var
medio: entero
amax1,bmax1,amax2,bmax2:datos
62
Algoritmos Avanzados
begin
si ini = fin
max1 = a[ini]
max2 = -
en otro caso si fin - ini = 1
si a[ini] > a[fin]
max1 = a[ini]
max2 = a[fin]
en otro caso
max1 = a[fin]
max2 = a[ini]
fin_si
en otro caso // No es suficientemente pequeo
medio = (ini + fin) div 2
maximos(ini, medio, amax1;amax2)
maximos(medio + 1, fin, bmax1;bmax2)
/*Se combinan los resultados:*/
si M1 > M2 M = M1
si M2 > m1
m = M2
en otro caso
m = m1
fin_si
en otro caso
M = M2
si M1 > m2
m = M1
en otro caso
m = m2
fin_si
fin_si
fin_si
fin_maximos
La primera llamada se har con maximos(1, n, a, b) estando los datos en un array de ndices
de 1 a n.
El Problema consiste en que dos amigos se ponen como juego para matar el tiempo, ver si
uno de ellos adivina el nmero que estas pensando el otro preguntando si el nmero que ha
pensado es menor.
Solucin al problema: A ver si adivinas el numero que estoy pensando?
63
Algoritmos Avanzados
El Problema consiste en que dos amigos se ponen como juego para matar el tiempo, ver si
uno de ellos adivina el nmero que estas pensando el otro preguntando si el nmero que ha
pensado es menor.
Primero se debe determinar un rango de trabajo para el problema, Ejemplo: Juan le pide a
Pedro que piense un nmero entre el 1 y el 100. este 1 ser nuestro inicio(ini), y el 10
nuestro final (fin). Supongamos que Pedro tiene es su mente el nmero 2.
Luego debemos de encontrar la mitad del problema, que para nuestro ejemplo sera el 5:
Inicio(Ini)
Medio
medio =
Final(fin)
10
(ini + fin )
2
Algoritmo
// Algoritmo desarrollado por Heber Huanca y Felicidad Silva
// para la materia de algoritmos avanzados
void BuscarNumero( int ini,int fin, int *res )
{int medio,x,n,r1=0,r2=0,sol;
medio=(fin+ini)/2;
cout<<"el numero es=> "<<medio<<"?";
cout<<"(presionamos 1=si y 2=no)";
n=leer(n);
if(n==1)
cout<<"\n el numero que pensaste es el=>"<<medio;
else
{ cout<<"es menor (1=si y 2 =no)=>";
x=leer(x);
if(x==1)
64
Algoritmos Avanzados
{ BuscarNumero (ini,medio,&r1); }
else
{ BuscarNumero (medio+1,fin,&r2); }
}
}
T(n) = 2T(n/2) + 4
Entonces
l=1
b=2
k=0
donde 1=20
entonces
65
66
Funcin objetivo (S). Dada una solucin devuelve el coste asociado a la misma
(resultado del problema de optimizacin).
67
4.2.4 EJEMPLOS
Ejemplo 1. PROBLEMA DEL CAMBIO DE MONEDAS.
Disponemos de monedas de 5 Bs, 2 Bs, 1Bs, 0.50 ctvs, 0.20 ctvs y 0.10 ctvs
Construir un algoritmo que dada una cantidad P devuelva esa cantidad con
monedas de estos tipos, usando un nmero mnimo de monedas.
Por ejemplo: para devolver 18.70Bs un posible conjunto solucin sera.: 3 monedas de
5Bs, 1 moneda de 2Bs, 1 moneda de 1Bs, 1 moneda de 0,50 ctvs y 1 moneda de 0.20
ctvs es decir S1={3,1,1,1,1,0}
Podemos aplicar la tcnica voraz y en cada paso aadir una moneda nueva a la solucin
actual, hasta que el valor llegue a P.
Candidatos iniciales: todos los tipos de monedas disponibles. Supondremos que C
contiene la cantidad de elementos
Solucin: conjunto de monedas que suman la cantidad P.
Una solucin ser de la forma (x1, x2, x3, x4, x5, x6, x7, x8), donde xi es el nmero de
monedas de tipo i. Suponemos que la moneda i vale ci.
Funciones:
o solucin. El valor actual ser solucin si
xici=P
68
20 Kg.
Por ejemplo : n = 3; M = 20
Donde n es el nmero de elementos y M la capacidad de la mochila
w = (18, 15, 10)
v = (25, 24, 15)
69
Funcin objetivo
i =1
Restriccin
x
i =1
vi
wi M
Si
w
i =1
i =1
>W
70
Algoritmo
El siguiente representa un algoritmo general, donde an no s dtrmin con exactitud la
funcin de seleccin
W = 100
w
v
v/w
10
20
2.0
20
30
1.5
30
66
2.2
40
40
1.0
50
60
1.2
71
Teorema
Si se seleccionan los objetos por orden decreciente de vi / wi ,
entonces el algoritmo de la mochila encuentra una solucin ptima.
72
de recubrimiento mnimo representa la red ms barata posible para dar servicio a todas
las ciudades.
Para resolver este tipo de problemas con algoritmos voraces:
Definicin 1
Definicin 2
Se dice que una arista sale de un conjunto de nodos dado si esa arista tiene
exactamente un extremo en el conjunto de nodos. Una arista puede no salir de un
conjunto de nodos ya sea porque ninguno de sus extremos est en el conjunto, o bien
porque sus dos extremos se encuentre en el conjunto.
Lema:
Sean:
G = <N, A> un grafo conexo no dirigido en el cual las aristas tienen longitudes
no negativas
B N un subconjunto propio de los nodos de G,
T A un conjunto prometedor de aristas tal que no hay ninguna arista de T que
salga de B y
v la arista ms corta que salga de B (o una de las ms cortas, si hay ms de
una).
Entonces T {v} es prometedor.
73
Los elementos de T que se incluyen en una componente conexa dada forman un rbol de
recubrimiento mnimo para los nodos de esa componente.
Al final del algoritmo, slo queda una componente conexa, as que T es un rbol de
recubrimiento mnimo para todos los nodos de G. Para construir componentes conexas
cada vez ms grandes, se examinan las aristas de G por orden creciente de longitudes. Si
una arista une a dos nodos de componentes conexas distintas, se aade a T, y las dos
componentes conexas forman ahora una nica componente. En caso contrario, se
rechaza la arista (porque une a dos nodos de la misma componente conexa formando un
ciclo).
Teorema
74
Ejemplo:
{5,7} y {5,6}.
Paso Arista
considerada
Inicializacin
{1},{2},{3},{4},{5},{6},{7}
1
{1,2}
2
{2,3}
3
{4,5}
4
{6,7}
5
{1,4}
6
{2,5}
Componentes conexas
{1,2},{3},{4},{5},{6},{7}
{1,2,3},{4},{5},{6},{7}
{1,2,3},{4,5},{6},{7}
{1,2,3},{4,5},{6,7}
{1,2,3,4,5},{6,7}
rechazado (forma ciclo)
75
Teorema
76
Ejemplo:
Seleccionar el nodo 1 el como inicial
Paso
Inicializacin
1
2
3
4
5
6
Arista considerada
{1,2}
{2,3}
{1,4}
{4,5}
{4,7}
{7,6}
Componentes
Conexas
{1}
{1,2}
{1,2,3}
{1,2,3,4}
{1,2,3, 4,5}
{1,2,3,4,5,7}
{1,2,3,4,5,6,7}
77
T = {{1,2}, {2,3}, {1,4}, {4,5}, {4,7}, {7,6}}
Suponga que en su andar cotidiano tiene que ir a 4 lugares diferentes durante 4 das de
la semana, es decir:
DIA
Lunes
Martes
Jueves
Viernes
ACTIVIDAD
Ir al Cine
Estreno de la Pelcula MATRIX RECARGADO
CINE MONJE CAMPERO EL PRADO
Ir al Stadium
Clsico Bolivar vs. The Strtongest
Cita con el dentista
Plaza San Francisco, Perez Velasco
Ira pagar el consumo del telfono a COTEL
Av. Mcal. Santa Cruz
Tomando como ejemplo la actividad del da Lunes. Qu camino tomaras t para llegar
a tu destino?
Las flechas representan las calles que pueden llevarte a tu destino.
Suponiendo que la cantidad de minutos desde su casa hacia cada lugar y de cualquier
lugar a otro, respetando las calles (flechas) de direccin, es la siguiente:
10
5
10
3
2
1
5
78
Este ejemplo es muy sencillo pero, que sucedera si estuviramos a cargo una empresa
de transporte?, los destinos son ms de 64 y las calles o avenidas para llegar a esos
destinos son el doble de 64 o ms.
Entonces cmo nos ayuda el Algoritmo Vors de Dijkstra?
El Algoritmo de Dijkstra halla los caminos ms cortos desde un nico origen
hasta los dems nodos del grafo.
79
En nuestro caso el algoritmo analizar todos los caminos uno a uno, mientras exista
caminos que analizar.
Entonces podemos tener 2 grupos:
o Caminos Seleccionados
o Caminos no Seleccionados
En el primer paso de inicializacin se tendr:
LUGARES donde quieres llegar, para ellos su distancia mnima desde tu casa hacia ellos
an no ha sido hallada y son candidatos a ser seleccionados posteriormente.
Conjunto D
En otro conjunto D, se irn almacenando los minutos que se tarda para llegar desde tu
casa hacia otro lugar. Llamado camino especial, porque todos los lugares intermedios a
lo largo del camino pertenecen al conjunto de los lugares seleccionados (conjunto S).
Por ejemplo : Supongamos que el Stadium ya pertenece al conjunto de lugares
seleccionados, entonces el camino ms corto de tu casa al Cine es a travs de un
desvo por el Stadium.
30
80
D= Duracin= 35 minutos.
Cundo se detiene el algoritmo?
Cuando todos los lugares (nodos) que se quieren llegar se encuentran en el conjunto de
lugares seleccionados(S), por tanto todos los caminos desde el origen hasta algn otro
nodo son especiales. Consiguientemente los valores que hay en D (conjunto de cantidad
de minutos), dan la solucin del problema de caminos mnimos.
81
Observaciones
No solamente se pueden aplicar a caminos con respecto a sus minutos de viaje, sino a la
cantidad de Km.
PSEUDOCDIGO
82
Por induccin:
o Si un nodo i 6= 1 est en S , D [ i ] es la longitud del camino ms corto desde el
origen a i .
o Si un nodo i no est en S , D [ i ] es la longitud del camino especial ms corto
desde el origen a i .
Base: Slo 1 est en S .
o se cumple trivialmente y
o se cumplen por cmo se inicializa D .(conjunto de cant. de minutos)
Hiptesis de induccin: (a) y (b) son ciertos justo antes de aadir v (candidato lugar) a
S.
Paso inductivo (a): Hay que probar que despus de aadir v sigue cumplindose
(a).
Para los nodos que ya estaban, no cambia nada .
Hay que comprobar que D [ v ] es el camino ms corto a v (candidato lugar).
83
CODIFICACION
Por qu Do While es
hasta n-2?
El Comportamiento de C
y D es:
C
{2,3,4,5}
{2,3,4}
{2,3}
{2}
D
{50,30,100,10}
{50,30,20,10}
{40,30,20,10}
{35,30,20,10}
Claramente D no
cambiara si se
hiciera una iteracin
ms para eliminar el
ltimo elemento de C
Function dijkstra()
Dim i,w, v As Integer
For i=2 To tam
c(i)=i
d(i)=g(1,i)
p(i)=1
Next
Do While(n-2>0)
v=c(n)
n=n-1
For w=v To w<=2 Step -1
If(((d(v)+g(v,w))<d(w)) And (g(v,w)<>0) And v<> w)
Then
d(w)=d(v)+g(v,w)
p(w)=v
End If
Next
Loop
End Function
Qu hace el If?
If interacta con D
y con P (para saber
por dnde pasarn
los caminos, estos
se almacenan en P)
Pregunta si D mas
la distancia del
nodo seleccionado
es mayor a D, y
adems la distancia
del nodo es
diferente de 0, y
adems si el lugar
elegido v es
diferente a W,
que es el nodo que
estamos revisando.
84
Las pantallas anteriormente mostradas son las salidas que dio el programa, los resultados
son los caminos mnimos desde el Origen hasta cada uno de los dems nodos. Entonces
llegamos a la conclusin de que:
30
5
35 minutos para llegar al cine, con un desvo por el
Stadium.
30
30 minutos para llegar al Stadium, ruta directa.
10
10
10
10 minutos para llegar a COTEL, con
ruta directa.
85
Algoritmos Avanzados
una primera decisin sera tomar direccin a B o C. En este momento es ptima A B, pero
tomar esta decisin nos lleva a una solucin no ptima. Da la impresin de que se cumple
el principio de optimalidad ya que en la solucin A B D las dos decisiones que se han
tomado son ptimas en un cierto sentido: la decisin de tomar A B es ptima pues es la
menor de las dos posibilidades en ese momento, y la decisin de tomar B D es ptima
pues es la nica posibilidad en ese momento.
Pero sin embargo no llegamos a una solucin ptima por lo que no puede cumplirse el
principio de optimalidad.
86
Algoritmos Avanzados
Si enfocamos el problema considerando que una solucin es ptima si se compone de
dos decisiones ptimas en el sentido: la primera solucin es ptima para pasar de A a B o
C y la segunda decisin es ptima para pasar de B o C a D; es cierto que una solucin
compuesta de dos soluciones ptimas de los subproblemas es una solucin ptima
global, pero no podemos asegurar que una solucin ptima se pueda descomponer en
soluciones ptimas de subproblemas con el tipo de subproblemas que hemos
considerado, por lo que no se cumple el principio de optimalidad. Pero s se cumple el
principio de optimalidad si consideramos que una solucin ptima para ir de A a D debe
estar compuesta de dos soluciones ptimas para ir de A a B o para ir de A a C y para ir de
B a D o para ir de C a D. De esta manera se ve que para resolver algunos problemas es
necesario resolver subproblemas de menor tamao y que tengamos que guardar las
soluciones de estos subproblemas para poder reconstruir a partir de ellas la solucin del
problema inicial. Como no sabemos a priori cules de estas soluciones ptimas de
subproblemas van a dar lugar a soluciones ptimas del problema global tenemos que
guardar toda la informacin, lo que hace que se necesite mucha memoria y que se hagan
clculos que a la postre se van a revelar como innecesarios.
4.3.1 CARACTERISTICAS
La programacin dinmica se suele utilizar en problemas de optimizacin, donde una
solucin est formada por una serie de decisiones.
Igual que la tcnica divide y vencers, resuelve el problema original combinando las
soluciones para subproblemas ms pequeos.
Sin embargo, la programacin dinmica no utiliza recursividad, sino que almacena los
resultados de los subproblemas en una tabla, calculando primero las soluciones para los
problemas pequeos.
Con esto se pretende evitar el problema de divide y vencers de calcular varias veces la
solucin para problemas pequeos.
4.3.2 CARACTERSTICAS COMUNES
Hay un conjunto de caractersticas que son comunes a estos dos ejemplos y a todos los
problemas de programacin dinmica.
El problema se puede dividir en niveles, se requiere una decisin en cada nivel.
En el problema de inversin de capital los niveles fueron las asignaciones para cada
planta, la decisin fue cunto gastar. En el problema de la ruta ms corta, los niveles se
definieron siguiendo la estructura del grafo, la decisin fue ir al siguiente.
Cada nivel tiene un conjunto de estados asociados a l. Los estados para el problema de
asignacin de capital corresponden a la cantidad gastada en ese punto en ese instante de
tiempo. Los estados de la ruta ms corta fueron los nodos visitados.
La decisin en un nivel transfoma un estado en un estado en el siguiente nivel.
En asignacin de capital : la decisin de cunto gastar dado una cantidad total gastada en
el siguiente nivel. En la ruta ms corta: la decisin de donde seguir dado la llegada en el
siguiente nivel.
Dado el estado actual, la decisin ptima para cada uno de los estados que faltan no
depende de los estados o de decisiones previas.
En asignacin de capital : no es necesario conocer cmo se gast el dinero en los niveles
previos, slo cunto se gast. En la ruta ms corta: no fue necesario conocer cmo se
87
Algoritmos Avanzados
lleg
al
nodo,
slo
se
necesitaba
saber
que
se
lleg
ese
nodo.
Hay una relacin de recursividad que identifica la decisin ptima para el nivel j, dado
que el nivel j+1 ya fue resuelto.
El nivel final debe resolverse por si mismo.
Las dos ltimas propiedades obedecen a las relaciones de recursividad dadas
anteriormente.
La potencialidad de la programacin dinmica, y el arte involucrado, es tomar un
problema y determinar sus niveles y estados, tal que las caractersticas mencionadas se
cumplan. Si esto es posible, entonces la relacin de recursividad permite encontrar los
valores en una forma relativamente fcil. La dificultad est en la determinacin de los
niveles y de los estados, para visualizar este aspecto se recomienda estudiar y analizar
los siguientes ejemplos.
4.3.4 EJEMPLOS
Ejemplo 1. CLCULO DE LOS NMEROS DE FIBONACCI.
Con divide y vencers
Fibonacci (n: integer)
Si n<2 Devolver n
Sino Devolver Fibonacci (n-1) + Fibonacci (n-2)
Problema: Muchos clculos estn repetidos, tiempo de ejec. exponencial.
Solucin: Calcular los valores de menor a mayor empezando por 0, e ir guardando los
resultados en una tabla.
Con programacin dinmica.
Fibonacci (n: integer)
T[0]:= 0; T[1]:= 1;
for i:= 2 to n do
T[i]:= T[i-1] + T[i-2];
Devolver T[n];
Se utiliza la misma frmula que en la versin anterior, pero de forma ms inteligente. El
tiempo de ejecucin es (n).
Ejemplo 2. CLCULO DEL COEFICIENTE BINOMIAL
88
Algoritmos Avanzados
Muchos valores C(i,j) i<n , j<n se calculan muchas veces C(2,2) o C(2,1)
La repeticin de clculos tiene orden exponencial
Se puede mejorar el algoritmo utilizando una tabla de resultados intermedios (tringulo de
Pascal), alcanzndose (nk)
89
Algoritmos Avanzados
Y y xk = 0 xk = 1 8k; i _ k _ j.
Para resolver el problema suponemos que hay que tomar n decisiones correspondientes
a si se mete o no un elemento en la mochila. Por lo tanto, una solucin ser
una secuencia de n ceros y unos, y la solucin ptima se podr_ encontrar por bsqueda
exhaustiva, tal como se puede ver en la _gura:
Intuitivamente, para tener una mochila con un peso de w, se debe terminar agregando
algn item. Si se agrega el item j, terminaremos con una mochila de tamao
disponible para ser llenada.
90
Algoritmos Avanzados
y Chicago antes de volver a New York. Cmo podra minimizar la distancia recorrida?.
Las distancias se muestran en la Tabla siguiente.
91
Algoritmos Avanzados
Los niveles sern asociados a cada ao. El estado ser la edad de la mquina en ese
ao. Las decisiones son ya sea mantener la mquina o rematarla y reemplazarla por una
nueva. Sea
el mnimo costo desde el instante t al 5, dado que la mquina tiene x
aos de antiguedad en el instante t.
Ya que se debe rematar en el instante 5,
Ahora se consideran los otros perodos de tiempo. Si se tiene en el instante t una mquina
con 3 aos de antiguedad, sta se debe rematar en:
Costo Mantenerla
.
As, la mejor decisin con una mquina que tiene dos aos de antiguedad es el mnimo de
los dos costos.
Anlogamente,
Nivel 4.
92
Algoritmos Avanzados
Nivel 3.
Nivel 2.
Nivel 1.
Nivel 0.
93
Algoritmos Avanzados
Posibilidades de Inversin
Cada planta slo podr realizar un de sus propuestas. El objetivo es maximizar el retorno
de la firma dada su inversin de $5 millones. Se supondr que si no se gastan los $5
millones completamente, ese dinero se perder.
Una forma de resolver este problema es intentar todas las posibilidades y elegir la mejor.
En ese caso, hay solo
formas de invertir el dinero. Muchas de estas
son infactibles (por ejemplo, propuestas 3, 4 y 1 para las tres plantas cuesta $6 millones).
Otras propuestas son factibles, pero son muy pobres en retorno (como propuestas 1, 1 y
2, con un retorno de slo $4 millones.)
Desventajas de una enumeracin completa:
Para problemas de gran tamao la enumeracin de todas las posibles soluciones puede
no ser factible computacionalmente.
Las combinaciones infactibles no pueden ser detectadas a priori, llevando a una
ineficiencia.
Informacin sobre combinaciones previamente investigadas no se usan para eliminar
otras combinaciones menos buenas, o infactibles.
Cabe hacer notar que este problema no puede ser formulado como un problema de
programacin lineal, porque los retornos no son funciones lineales.
Un mtodo para calcular la solucin es:
Dividamos el problema en 3 niveles: cada nivel representa el dinero asignado a una nica
planta. Asi el nivel 1 representa el dinero asignado a la planta 1. Artificialmente se dar un
orden a los niveles, asumiendo que primero se asignar a la planta 1, luego a la planta 2 y
finalmente a la planta 3.
Cada nivel est dividido en estados. Un estado guarda la informacin requerida para ir
desde un nivel al siguiente nivel.
En este caso los estados por nivel 1, 2 y 3 son:
{0,1,2,3,4,5}: cantidad de dinero gastado en la planta 1, representado como
,
{0,1,2,3,4,5}: cantidad de dinero gastado en las plantas 1 y 2 (
), y
{5}: cantidad de dinero gastado en las plantas 1, 2, y 3 (
).
Es necesario notar que diferentemente a lo que es programacin lineal, las
no
representan variables de decisin: ellas son simplemente representaciones de un estado
genrico
en
el
nivel.
Un retorno es asociado a cada estado. Se debe notar que para tomar una decisin en el
estado 3, es slo necesario conocer cuanto fue gastado en las plantas 1 y 2, no cmo
esto fue gastado. Tambin note que se desea que
sea 5 Determinando los retornos
asociados a cada estado, lo ms fcil es en el nivel 1, los estados
Tabla entrega el
retorno asociado con
.
94
Algoritmos Avanzados
Clculos en el nivel 1
Ahora se pueden calcular para el nivel 2. En este caso, deseamos encontrar la mejor
solucin tanto para la planta 1 como para la planta 2. Si se desea calcular el mejor retorno
para un
dado,simplemente se analizarn todas las propuestas de la planta 2,
asignando la cantidad requerida a la planta 2 y usar la tabla anterior para ver cmo la
planta 1 gastar el excedente. Por ejemplo, supongamos que deseamos determinar la
mejor asignacin para el estado
siguientes
es 14.
Clculos en el nivel 2 .
Ahora se puede analizar el nivel 3. El nico valor en el que estamos interesados
es
.
Nuevamente, se analizr todas las propuestas para este nivel, determinando la cantidad
95
Algoritmos Avanzados
de dinero remanente y usando la ltima tabla para decidir el valor de los niveles previos.
Asi se puede realizar lo siguiente en la planta 3:
Propuesta1 da un retorno 0, deja 5. Niveles previos dan 17. Total: 17.
Propuesta 2 da un retorno 4, deja 4. Niveles previos dan 14. Total: 18.
De esta manera, la solucin ptima es implementar la propuesta 2 de la planta 3,
propuesta 2 o 3 en la planta 2 y la propuesta 3 o 2 (respectivamente) en la planta 1. Esto
da un retorno de 18.
Si se estudia este procedimiento, uno puede observar que los clculos son efectuados
recursivamente. Los clculos en el nivel 2 estn basados en el nivel 1, el nivel 3 slo en el
nivel 2. A su vez, estando en un estado, todas las futuras decisiones son tomadas
independientemente de como se lleg a ese estado. Este es el prinicipio de optimalidad
en el cual se sustenta la programacin dinmica.
Se pueden resumir estos clculos en las siguientes frmulas:
Sea
correspondiente. Sea
siguientes clculos:
en el estado
j,y por
el costo
Los clculos fueron llevados a cabo por un procedimiento forward. Sin embargo, tambin
se
calcularon
"cosas"
desde
el
ltimo
nivel
hacia
el
primero.
Se define:
= cantidad asignada a los niveles 1, 2, y 3,
= cantidad asignada a los niveles 2 y 3, y
= cantidad asignada al nivel 3.
Esto define una recursividad backward. Grficamente esto se ilustra en la Figura 1.
96
Algoritmos Avanzados
,y
.
y
Si lleva a cabo todos estos clculos llegar al mismo resultado.
Aunque la recursividad forward parezca ms natural, se introdujo una recursividad hacia
backward. En este caso particular l orden de los niveles no es relevante. En otros casos
puede haber ventajas computacionales en la eleccin uno versus otro orden. En general,
la recursividad backward es ms efectiva.
97
Algoritmos Avanzados
n
Si m = 0 m = n
= 1
m
n n 1 n 1
Si 0 < m < n
=
+
m m m 1
Conociendo que el resultado puede ser calculado tambin con la frmula:
n!/(m!(n-m)!)
Dar una funcin recursiva para calcular , usando la primera de las definiciones. Cul
m
98
Algoritmos Avanzados
Suponiendo que modificamos el algoritmo de programacin dinmica para usar la
segunda frmula, mostrar el resultado del algoritmo para el siguiente ejemplo: n= 4, c= {1,
3, 4}, P= 7.
Estimar el orden de complejidad del algoritmo. Compararlo con el algoritmo visto en clase.
* Resolver con programacin dinmica el problema de minimizar el nmero de monedas a
devolver para dar una cantidad C si tenemos monedas de n tipos, estando los tipos de las
monedas en un array tipos: array[1,..,n] of integer, y teniendo de cada tipo una cierta
cantidad de monedas, estando estas cantidades almacenadas en un array cantidad:
array[1,..,n] of integer (de la moneda de tipo tipos[i] podemos dar una cantidad entre 0 y
cantidad[i]). No habr que programar la resolucin, pero s habr que dar la ecuacin
recurrente con la que se resuelve el problema, indicar qu tablas se utilizan y cmo se
rellenan, cmo se recompone la solucin, cules son y qu valores tienen los casos base,
y estudiar el tiempo de ejecucin.
Una agencia de turismo realiza planificaciones de viajes areos. Para ir de una ciudad A a
B puede ser necesario coger varios vuelos distintos. El tiempo de un vuelo directo de I a J
ser T[I, J] (que puede ser distinto de T[J, I]). Hay que tener en cuenta que si cogemos un
vuelo (de A a B) y despus otro (de B a C) ser necesario esperar un tiempo de escala
adicional en el aeropuerto (almacenado en E[A, B, C]).
Disear una solucin para resolver este problema utilizando programacin dinmica.
Explicar cmo, a partir de las tablas, se puede obtener el conjunto de vuelos necesarios
para hacer un viaje concreto.
Mostrar la ejecucin del algoritmo sobre la siguiente matriz T, suponiendo que todos los
E[A, B, C] tienen valor 1. Cul es el orden de complejidad del algoritmo?
T[i, j]
A
B
C
D
A
7
2
3
B
2
2
4
C
1
9
8
D
3
2
1
-
* Supongamos una serie de n trabajos denominados a, b, c, ... y una tabla B[1..n, 1..n],
en la que cada posicin B[i, j] almacena el beneficio de ejecutar el trabajo i y a
continuacin el trabajo j. Se quiere encontrar la sucesin de m trabajos que d un
beneficio ptimo. No hay lmite en el nmero de veces que se puede ejecutar un trabajo
concreto.
Idear un algoritmo por programacin dinmica que resuelva el problema. Para ello, definir
un subproblema (que permita realizar la combinacin de problemas pequeos para
resolver problemas grandes), especifica la ecuacin de recurrencia para el mismo (con
sus casos base) y despus describe las tablas necesarias y cmo son rellenadas.
Ejecutar el algoritmo sobre la siguiente tabla, suponiendo que m= 5.
B[i, j]
A
B
C
a
2
4
3
b
2
1
2
c
5
3
2
99
Algoritmos Avanzados
8
3
2
4
3
4
2
6
4
5
1
5
100
Algoritmos Avanzados
Ejecutar sobre el siguiente ejemplo: X= {2, 4, 3, 9, 10}, P= 18.
Nota: tener en cuenta que el problema no es de optimizacin, sino de encontrar si existe
una solucin o no.
En el problema de la mochila (igual que en el problema del cambio de monedas) puede
existir en general ms de una solucin ptima para unas entradas determinadas. Cmo
se puede comprobar si una solucin ptima es nica o no, suponiendo que hemos
resuelto el problema utilizando programacin dinmica? Dar un algoritmo para que, a
partir de las tablas resultantes del problema de la mochila, muestre todas las soluciones
ptimas existentes.
En el problema de la multiplicacin encadenada de matrices, la tabla deba ser rellenada
por diagonales, empezando por la diagonal 1 hasta la n. Especificar de forma ms
detallada (en notacin Pascal) cmo se podra implementar el rellenado de la tabla para
que los clculos fueran realizados en este orden. Ejecutar sobre el siguiente ejemplo, n =
6, tamaos d = (23, 40, 2, 20, 6, 40, 12).
Un play off por el descenso se juega al mejor de 2n-1 partidos. Los dos equipos juegan
varios partidos hasta que uno gane n encuentros. Ese equipo ser el que permanece y el
otro desciende a 3 regional. Supongamos que se enfrentan Real Murcia y Las Palas. Si
en un momento dado el Real Murcia ha ganado i partidos y perdido j, queremos calcular
la probabilidad de que permanezca que llamaremos P(i, j). Suponer que la probabilidad de
que el Real Murcia gane un partido es 0.3 y la probabilidad de que pierda 0.7 (no
posibilidad de empate).
Aplicarla tcnica de programacin dinmica para resolver este problema. Para ello, definir
la ecuacin de recurrencia de P(i, j) (con sus casos base), la estructura de las tablas
utilizadas y la forma de rellenarlas. Idea: dada la situacin (i partidos ganados, j partidos
perdidos) considerar qu puede ocurrir en el siguiente partido. Tener en cuenta que si uno
llega a n entonces se acaba la competicin.
* Usando la frmula recursiva para el problema de la mochila 0/1 (vista en clase, en
programacin dinmica), escribe un procedimiento que resuelva el problema pero con
divide y vencers. El cuerpo del procedimiento debe ser:
Mochila(i: entero; M: entero; v, w: array[1..n] of entero):entero;
Siendo:
i = Nmero de objetos a usar (desde 1 hasta i). M = Capacidad de la mochila.
v, w = Beneficio y peso de los objetos. Valor devuelto = Beneficio ptimo.
* Un sistema dispone de m procesadores (P1, P2, ..., Pm), que deben ejecutar un conjunto
de n tareas distintas (T1, T2, ..., Tn), disponibles en el instante inicial. De cada tarea se
conoce el nmero de instrucciones que ejecuta ti (se supone que todas las instrucciones
requieren el mismo tiempo), y de cada procesador se tiene su velocidad de procesamiento
vi, en nmero de instrucciones por segundo. Se supone que cada procesador ejecuta las
tareas de manera secuencial, es decir sin partirlas.
El objetivo consiste en dar una planificacin que minimice el tiempo medio de finalizacin
de las tareas. Una planificacin consistir en asignar cada tarea a un procesador, y en un
orden determinado. El tiempo medio de finalizacin ser la media de los tiempos que cada
tarea tiene que esperar, desde el instante inicial hasta que acaba de ejecutarse.
101
Algoritmos Avanzados
Dar una buena solucin para el problema, usando la tcnica que creas ms adecuada de
entre las siguientes: divide y vencers, algoritmos voraces o programacin dinmica. Se
pide explicar el funcionamiento del algoritmo y dar un esquema en pseudocdigo de su
estructura.
Ejecutar el algoritmo diseado sobre el siguiente ejemplo: m= 3, n= 6,
t= (35, 40, 20,
25, 10, 50), v= (5, 1, 10).
Hacer una estimacin del orden de complejidad del algoritmo.
El algoritmo diseado, obtiene siempre la solucin ptima?
* Un sistema de ecuaciones sobredeterminado (con muchas ms ecuaciones m que
incgnitas n), puede expresarse matricialmente como: AX = B, siendo:
A (mxn): matriz de coeficientes,
X (nx1): vector de incgnitas,
B (mx1): vector de trminos independientes.
La solucin de mnimos cuadrados puede calcularse con:
X = (ATA)-1ATB
Encuentra todos los posibles rdenes en los que se pueden hacer las multiplicaciones
matriciales para calcular X. Para cada uno de ellos, estima el nmero de productos
escalares necesario, en funcin de m y de n. Se supone que se usa el mtodo clsico de
multiplicacin de matrices (y no el mtodo de Strassen). No es necesario contar las
operaciones necesarias para el clculo de la inversa o de la transpuesta.
Cul es el orden ptimo para calcular X? Compara el valor anterior con el nmero de
multiplicaciones requeridas en otro orden que no sea ptimo. Qu se puede decir, en
cuanto al tiempo de ejecucin y al orden de complejidad (el orden O(..) y la o-pequea)?
102
Algoritmos Avanzados
102
Algoritmos Avanzados
Por ltimo, se exponen una serie de problemas tpicos que se pueden resolver fcilmente
con las tcnicas de vuelta atrs. El primero que se expone es muy conocido. Se trata de
la vuelta del caballo. Muchos problemas de los pasatiempos de los peridicos pueden
resolverse con la ayuda de un ordenador y en esta web se muestran algunos de ellos.
4.4.4 EJEMPLOS
Ejemplo 1. LA VUELTA DEL CABALLO
Se dispone de un tablero rectangular, por ejemplo el tablero de ajedrez, y de un caballo,
que se mueve segn las reglas de este juego. El objetivo es encontrar una manera de
recorrer todo el tablero partiendo de una casilla determinada, de tal forma que el caballo
pase una sola vez por cada casilla. Una variante es obligar al caballo a volver a la
posicin de partida en el ltimo movimiento. Por ltimo se estudiar como encontrar todas
las soluciones posibles partiendo de una misma casilla.
Para resolver el problema hay que realizar todos los movimientos posibles hasta que ya
no se pueda avanzar, en cuyo caso hay que dar marcha atrs, o bien hasta que se cubra
el tablero. Adems, es necesario determinar la organizacin de los datos para
implementar el algoritmo.
Cmo se mueve un caballo?. Para aquellos que no sepan
jugar al ajedrez se muestra un grfico con los ocho
movimientos que puede realizar. Estos movimientos sern
los ocho candidatos.
Con las coordenadas en las que se encuentre el caballo y las
ocho coordenadas relativas se determina el siguiente
movimiento.
103
Algoritmos Avanzados
El tablero, del tamao que sea, se representar mediante un array bidimensional de
nmeros enteros. A continuacin se muestra un grfico con un tablero de tamao 5x5 con
todo el recorrido partiendo de la esquina superior izquierda.
Cuando se encuentra una solucin, una variable que se
pasa por referencia es puesta a 1 (cierto). Puede hacerse
una variable de alcance global y simplificar un poco el
cdigo, pero esto no siempre es recomendable.
Para codificar el programa, es necesario considerar
algunos aspectos ms, entre otras cosas no salirse de los
lmites del tablero y no pisar una casilla ya cubierta
(seleccin del candidato). Se determina que hay solucin
cuando ya no hay ms casillas que recorrer.
A continuacin se expone un cdigo completo en C, que
recubre un tablero cuadrado de lado N partiendo de la
posicin (0,0).
#include <stdio.h>
#define N 5
#define ncuad N*N
void mover(int tablero[][N], int i, int pos_x, int pos_y, int *q);
const int ejex[8] = { -1,-2,-2,-1, 1, 2, 2, 1 },
ejey[8] = { -2,-1, 1, 2, 2, 1,-1,-2 };
int main(void)
{
int tablero[N][N]; /* tablero del caballo. */
int i,j,q;
/* inicializa el tablero a cero */
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
tablero[i][j] = 0;
/* pone el primer movimiento */
tablero[0][0] = 1;
mover(tablero,2,0,0,&q);
if (q) { /* hay solucion: la muestra. */
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%3d ", tablero[i][j]);
putchar('\n');
}
}
else
printf("\nNo existe solucion\n");
104
Algoritmos Avanzados
return 0;
}
void mover(int tablero[][N],int i, int pos_x, int pos_y, int *q)
{
int k, u, v;
k = 0;
*q = 0;
do {
u = pos_x + ejex[k]; v = pos_y + ejey[k]; /* seleccionar
candidato */
if (u >= 0 && u < N && v >= 0 && v < N) { /* esta dentro de
los limites? */
if (tablero[u][v] == 0) { /* es valido? */
tablero[u][v] = i; /* anota el candidato */
if (i < ncuad) { /* llega al final del recorrido? */
mover(tablero,i+1,u,v,q);
if (!*q) tablero[u][v] = 0; /* borra el candidato */
}
else *q = 1; /* hay solucion */
}
}
k++;
} while (!*q && k < 8);
}
Cambiando el valor de N puede obtenerse una solucin para un tablero cuadrado de
tamao N.
A continuacin, se muestra una adaptacin del procedimiento que muestra todas las
soluciones. Si se ejecuta para N = 5 se encuentra que hay 304 soluciones partiendo de la
esquina superior izquierda. Cuando se encuentra una solucin se llama a un
procedimiento (no se ha codificado aqu) que imprime todo el tablero.
void mover(int tablero[][N],int i, int pos_x, int pos_y)
{
int k, u, v;
for (k = 0; k < 8; k++) {
u = pos_x + ejex[k]; v = pos_y + ejey[k];
if (u >= 0 && u < N && v >= 0 && v < N) { /* esta dentro de los
limites */
if (tablero[u][v] == 0) {
tablero[u][v] = i;
if (i < ncuad)
mover(tablero,i+1,u,v);
else imprimir_solucion(tablero);
tablero[u][v] = 0;
}
}
}
}
105
Algoritmos Avanzados
106
Algoritmos Avanzados
int col[8];
boolean fila[8],diagb[15], diagc[15];
for (i = 0; i < 8; i++) fila[i] = TRUE;
for (i = 0; i < 15; i++) diagb[i] = diagc[i] = TRUE;
ensayar(0,&q,col,fila,diagb,diagc);
if (q) {
printf("\nSolucion:");
for (i = 0; i < 8; i++) printf(" %d", col[i]);
} else printf("\nNo hay solucion");
return 0;
}
void ensayar(int i, boolean *q, int col[], boolean fila[], boolean
diagb[], boolean diagc[])
{
int j;
j = 0;
*q = FALSE;
do {
if (fila[j] && diagb[i+j] && diagc[7+i-j]) {
col[i] = j; fila[j] = diagb[i+j] = diagc[7+i-j] = FALSE;
if (i < 7) { /* encuentra solucion? */
ensayar(i+1,q,col,fila,diagb,diagc);
if (!*q)
fila[j] = diagb[i+j] = diagc[7+i-j] = TRUE;
} else *q = TRUE; /* encuentra la solucion */
}
j++;
} while (!*q && j < 8);
}
Por ltimo, se deja al lector que implemente un procedimiento que encuentre todas las
soluciones. Si se desea complicar ms entonces se puede pedir que encuentre todas las
soluciones distintas, es decir, aquellas que no sean rotaciones o inversiones de otras
soluciones.
Ahora que se conoce el mtodo general, puede hacerse extensible a mltiples piezas
simultneamente.
Ejemplo 3 EL PROBLEMA DE LA MOCHILA (SELECCIN PTIMA)
Con anterioridad se ha estudiado la posibilidad de encontrar una nica solucin a un
problema y la posibilidad de encontrarlas todas. Pues bien, ahora se trata de encontrar la
mejor solucin, la solucin ptima, de entre todas las soluciones.
Partiendo del esquema que genera todas las soluciones expuesto anteriormente se puede
obtener la mejor solucin (la solucin ptima, seleccionada entre todas las soluciones) si
se modifica la instruccin almacenar_solucion por esta otra: si f(solucin) > f(optimo)
107
Algoritmos Avanzados
entonces optimo <- solucin siendo f(s) funcin positiva, optimo es la mejor solucin
encontrada hasta el momento, y solucin es una solucin que se est probando.
El problema de la mochila consiste en llenar una mochila con una serie de objetos que
tienen una serie de pesos con un valor asociado. Es decir, se dispone de n tipos de
objetos y que no hay un nmero limitado de cada tipo de objeto (si fuera limitado no
cambia mucho el problema). Cada tipo i de objeto tiene un peso wi positivo y un valor vi
positivo asociados. La mochila tiene una capacidad de peso igual a W. Se trata de llenar
la mochila de tal manera que se maximice el valor de los objetos incluidos pero
respetando al mismo tiempo la restriccin de capacidad. Notar que no es obligatorio que
una solucin ptima llegue al lmite de capacidad de la mochila.
Ejemplo: se supondr:
n=4
W=8
w() = 2, 3, 4, 5
v() = 3, 5, 6, 10
Es decir, hay 4 tipos de objetos y la mochila tiene una capacidad de 8. Los pesos varan
entre 2 y 5, y los valores relacionados varan entre 3 y 10.
Una solucin no ptima de valor 12 se obtiene introduciendo cuatro objetos de peso 2, o 2
de peso 4. Otra solucin no ptima de valor 13 se obtiene introduciendo 2 objetos de peso
3 y 1 objeto de peso 2. Cul es la solucin ptima?.
A continuacin se muestra una solucin al problema, variante del esquema para obtener
todas las soluciones.
void mochila(int i, int r, int solucion, int *optimo)
{
int k;
for (k = i; k < n; k++) {
if (peso[k] <= r) {
mochila(k, r - peso[k], solucion + valor[k], optimo);
if (solucion + valor[k] > *optimo) *optimo =
solucion+valor[k];
}
}
}
Dicho procedimiento puede ser ejecutado de esta manera, siendo n, W, peso y valor
variables globales para simplificar el programa:
n = 4,
W = 8,
peso[] = {2,3,4,5},
valor[] = {3,5,6,10},
optimo = 0;
...
mochila(0, W, 0, &optimo);
Observar que la solucin ptima se obtiene independientemente de la forma en que se
ordenen los objetos.
108
Algoritmos Avanzados
5 ALGORITMOS PROBABILISTAS
5.1 INTRODUCCIN
Existen muchos problemas en los que llegado a cierto punto, se ha de tomar una
decisin ptima. A menudo, la bsqueda de esta decisin toma un tiempo excesivo
A veces es mejor no tomar esta decisin ptima, sino tomar una buena decisin
En algunas ocasiones tomar decisiones aleatorias nos puede llevar a la solucin
deseada
En trminos de la Teora de Algoritmos: cuando se tenga que realizar una eleccin en
un algoritmo, a veces es preferible hacerlo aleatoriamente en vez de perder tiempo en
decidir cul de las posibles alternativas es la correcta
Esta eleccin aleatoria debe se, en promedio, ms eficiente que la decisin, aunque en
algn caso el proceso aleatorio tome, por mala suerte, ms tiempo
En estos casos hablamos de tiempo esperado de ejecucin y no de orden de
complejidad
En este tema se vern algoritmos que, basados en la Teora de la Probabilidad,
encuentran una solucin aproximada o una solucin exacta (aunque a veces no la
encuentran o dan una solucin errnea)
5.2 CLASIFICACIN
PROBABILISTAS:
DE
LOS
ALGORITMOS
109
Algoritmos Avanzados
110
Algoritmos Avanzados
Diferencias: los multiplicativos son ms rpidos, aunque tienen una menor longitud de
ciclo
Propiedades del generador de esta naturaleza: fcilmente reproducible (comenzando por
la misma semilla), se obtiene rpidamente y ocupa poco espacio de memoria. Hay que
esforzarse en conseguir que cumpla tambin las dos primeras propiedades: uniformidad e
independencia
Teorema: La sucesin congruencial definida por X0, a, c y m es de
perodo mximo si y slo si:
C es primo relativo a m (su mximo comn divisor es 1)
a-1 es mltiplo de p, p primo que divida a m
a-1 es mltiplo de 4 si m es mltiplo de 4
Ejemplo: a = 21, c = 27 y m = 20
Generador que cumple las 5 reglas: el propuesto por Lehmer:
a = 48.271; c = 0; m = 231 1 = 2.147.483.647
Problema: produce overflow con algunos valores
Solucin: Reducir la expresin a:
111
Algoritmos Avanzados
El objetivo de estos algoritmos es que en sucesivas llamadas a la rutina principal, se
rebaje la probabilidad de error
Nunca se debe dar como vlido un algoritmo MonteCarlo que falle
siempre para una misma instancia de un problema
5.4.1 DEFINICINES
o Algoritmo MonteCarlo p-correcto, (con < p < 1): algoritmo que devuelve una
solucin correcta con una probabilidad no menor que p sea cual sea el caso
considerado
o Algoritmo MonteCarlo consistente: devuelve siempre la misma solucin correcta
para la misma entrada
Los algoritmos resultantes de aplicar la tcnica MonteCarlo son extremadamente
simples y eficientes
112