Vous êtes sur la page 1sur 11

1.

Queremos especificar formalmente el TAD Carro que representa un carro de la compra


en el que podemos meter productos, sacarlos, consultar cuntos llevamos y saber el
precio de la compra. Suponer que tenemos ya definidos los TAD Natural, Booleano y
Producto, con las siguientes operaciones: (2 puntos)
N=Natural: cero, sucesor, esCero, esMenor, suma, resta, multiplica.
Producto: esIgual comprueba si dos productos son iguales o no!, precio dado un
producto, devuelve un natural que ser su precio!. "ste TAD tendr constructores
constantes como manzanas, peras, patatas, etc.
"scribir la especificaci#n formal a$iomtica del TAD Carro con las siguientes
operaciones: carroVaco devuelve un carro sin productos!, meter recibe un carro, un
producto y un natural que indica el n%mero de veces que se mete ese producto!, sacar
dado un carro, un producto y un natural, saca el producto el n%mero indicado de
veces!, cuntos dado un carro y un producto, devuelve un natural que indica el n%mero
de veces que est ese producto!, precio dado un carro, calcula el coste total de la
compra!, cajaRpida dado un carro, devuelve un booleano que indica si el n%mero de
productos distintos es menor que &!.
Solucin:
'laramente, los constructores son carroVaco y meter. A(adimos la operaci#n distintos, que
ser de utilidad en cajaRpida.
)*+,-"
carro productos!
'*)./)T*S
': con0unto de carros
1: con0unto de productos
): con0unto de naturales
,: con0unto de booleanos
S2)TA32S
carro4ac5o: '
meter: ' $ 1 $ ) '
sacar: ' $ 1 $ ) '
cuntos: ' $ 1 )
precio: ' )
ca0a-pida: ' ,
distintos: ' )
S"+6)T2'A
p, p7 18 n, n7 )8 c '
1. sacar carro4ac5o, p, n! 9 carro4ac5o
:. sacar c, p, cero! 9 c
3. sacar meterc, p, n!, p7, n7! 9 S2 es2gualp, p7! ; es+enorn7, n! meterc, p,
restan, n7!!
< S2 es2gualp, p7! sacarc, p, restan7, n!!
< metersacarc, p7, n7!, p, n!!
=. cuntos carro4ac5o, p! 9 cero
5. cuntos meterc, p, n!, p7! 9 S2 es2gualp, p7! suman,cuntosc, p7!!
< cuntosc, p7!
>. precio carro4ac5o! 9 cero
?. precio meterc, p, n!! 9 sumaprecioc!, multiplican, preciop!!!
@. ca0a-pida c! 9 es+enordistintosc!,
sucesorsucesorsucesorsucesorsucesorcero!!!!!
A. distintos carro4ac5o! 9 cero
1B. distintos meterc, p, cero! 9 distintos c!
11. distintos meterc, p, n!! 9 S2 es'erocuntosc, p!! sucesordistintosc!!
< distintosc!
:. /n poeta 0oven tiene dificultad para encontrar rimas. 'omo es un poetaCinformtico
decide Dacer una operaci#n que le facilite la b%squeda de rimas. Tiene una serie de
palabras almacenadas en un rbol trie, y quiere Dacer un algoritmo que reciba el trie,
una palabra con la que quiere rimar, y un entero que indica la letra de la palabra a
partir de la que se rima la rima ser consonante!, que escriba las palabras que riman
con la palabra de entrada. 1rogramar esta operaci#n. Eabr que Dacerla sobre el trie
original no se podr formar un trie invirtiendo las palabras en el trie original!. Suponer
que e$iste sobre el tipo trie una operaci#n Consulta (n: trie, c: carcter: trie y un
iterador del tipo para cada carcter c !ijo del nodo n !acer.
Solucin:
AnaliFando un poco el problema, vemos que bsicamente no nos queda ms remedio que
buscar todas las palabras del trie. 1ara cada palabra, una veF e$tra5da a una cadena un
array de caracteres!, comprobamos en una simple iteraci#n si es rima o no. Suponemos las
operaciones t5picas con cadenas de acceso y concatenaci#n.
operacin BuscarRimas (t: NodoTrie; rima: cadena; pos: entero)
Gistar1alabras t, rima, pos, HI! "" #samos una operaci$n au%iliar,
recursi&a
operacin ListarPalabras (t: NodoTrie; rima: cadena; pos: entero; pre: cadena)
si 'onsultat, J! K )/G* entonces
'omprobar rima, pre, pos!
para cada carcter c i!o del nodo t acer
Gistar1alabras 'onsultat, c!, rima, posL1, preLc!
operacin "omprobar (pal#$ pal2: cadena; pos: entero)
para i:9 pos, ..., Gongitudpal1! acer
si pal1MiN K pal:MiN entonces
de%ol%er
"scribir HGa palabra I, pal:, H es una rimaI!
O. "l +etro de +ula ya est en funcionamiento. Su uso supondr una reducci#n en los
tiempos de desplaFamiento, ms en las distancias largas que en las cortas. Ga compa(5a
H+etro de +ulaI quiere medir la ganancia de tiempo entre todos los pares de puntos del
pueblo. Ga ganancia para dos puntos a y ' se define como la diferencia entre el tiempo
m5nimo entre a y ' sin usar el metro, y el tiempo m5nimo entre a y ' pudiendo usar el
metro. )otar que en este segundo m5nimo puede que lo conveniente sea no usar el
metro, o usarlo una o varias veces. Eay que tener en cuenta que cada veF que
entramos o salimos del metro tardamos un tiempo adicional (. Dise(ar un algoritmo
para resolver el problema, obteniendo la ganancia total. Eabr que escribir el programa
en pseudoc#digo, y cuando se usen llamadas a algoritmos estudiados no ser necesario
programar dicDos algoritmos pero s5 aclarar los datos de entrada y salida.
Datos del problema. "l mapa de la ciudad tiene n puntos. Gos tiempos de los caminos
directos v5a superficie es decir, sin usar el metro! estn dados en la matriF de costes ).
Gos tiempos entre los mismos puntos usando el metro estn dados en la matriF M.
Ambas matrices son simPtricas y ambas contendrn L si no e$iste camino o l5nea de
metro entre dos puntos. -ecordar tambiPn el tiempo adicional ( cada veF que se entra
o sale del metro.
Solucin:
Gos caminos m5nimos por superficie entre cualquier par de puntos se pueden calcular
aplicando el algoritmo de Qloyd sobre la matriF ). 1ero, Ro0oS, si lo aplicamos tambiPn sobre
M no tenemos los caminos m5nimos Hpudiendo usar el metroI que pide el enunciado, sino
usando el metro siempre. Tampoco ser5a sencillo combinar los caminos m5nimos obtenidos
aplicando Qloyd a ) y a M por separado, porque el m5nimo puede pasar mucDas veces de
metro a superficie, y al revPs.
)o obstante, el problema no de0a de ser de caminos m5nimos. Ga cuesti#n es obtener una
matriF de costes que modele la nueva situaci#n. "n particular, si tenemos n nodos en el
grafo, creamos un grafo con :n nodos, donde los nodos 1, :, ..., n! son los puntos de la
ciudad en superficie, y los nL1, ..., :n! representan los mismos puntos en la red de metro.
"ntre los primeros n nodos tendremos los costes de ), y entre los siguientes n los de M.
Adems, de acuerdo con el enunciado, debemos a(adir entre cada par de nodos i, nLi! una
arista de coste (. "n definitiva, el algoritmo podr5a ser como el siguiente.
operacin &etro&ula (T$ &: arra' (#))n$ #))n* de real; +: real) : real
%ar D1: arra' M1..n, 1..nN de real
', D:: arra' M1..:n, 1..:nN de real
para i:9 1, ..., :n acer
para 0:9 1, ..., :n acer
si i T n! ; 0 T n! entonces 'Mi, 0N:9 TMi, 0N
sino si i U n! ; 0 U n! entonces 'Mi, 0N:9 +MiCn, 0CnN
sino si i 99 0 L n! * 0 99 i L n! entonces 'Mi, 0N:9 V
sino 'Mi, 0N:9 B
,inpara
,inpara
Qloyd T, D1! "" *uponemos +ue el primer parmetro es la matriz de costes
Qloyd ', D:! "" , el segundo es la matriz de caminos mnimos resultantes del
algoritmo
suma:9 B
para i:9 1, ..., n acer
para 0:9 iL1, ..., n acer
suma:9 suma L D1Mi, 0N C D:Mi, 0N
de%ol%er sumaWnnC1!W:!
1. *btener , *, y o peque(a del siguiente algoritmo:
sum:9B
para i:91 asta n acer
para 0:91 asta i
:
acer
si 0 mod i 9B entonces
para X:91 asta 0 acer
sum:9sumL1
,inpara
,insi
,inpara
,inpara
Solucin:
AnaliFando el algoritmo, se puede ver que siempre se realiFa el mismo n%mero de
operaciones para un n determinado, de manera que coinciden el me0or y peor caso, y
podemos obtener un orden e$acto. 1ara ello, debemos predecir cuntas veces ser cierta la
condici#n Hsi 0 mod i 9 B entonces )))I8 es ms, no s#lo cuntas sino tambiPn para quP
valores de j. Ga me0or manera de verlo es simular la e0ecuci#n del algoritmo Dasta llegar a
una conclusi#n general.
a. 1ara i91, j va de 1 a 1, y se e0ecuta el bucle interno con - desde 1 Dasta 1.
b. 1ara i9:, j va de 1 a =, y se cumple la condici#n para j9 : y =. De esta forma, el bucle
interno se e0ecuta primero con -9 1..: y luego con -9 1..=.
c. 1ara i9O, j va de 1 a A, y se cumple la condici#n para j9 O, > y A.
d. 1ara i9=, j va de 1 a 1>, y se cumple la condici#n para j9 =, @, 1: y 1>.
e. "n general, para cualquier i, se cumple la condici#n para j9 i, :i, Oi, ..., iYi
1or lo tanto, para cada valor de i, las instrucciones del bucle ms interno se e0ecutan
iL:iLOiL...LiYi veces, lo cual se puede poner como:

i
p
p i
1
. Teniendo esto en cuenta, si
contamos todas las instrucciones del algoritmo, obtenemos la f#rmula para el tiempo de
e0ecuci#n t(n:

,
_

+ + +


i
p
i
j
n
i
p i n t
1 1 1
2 2 1 1 ) (
2
*bservar que el tercer sumatorio el que Demos deducido arriba! no va dentro del
sumatorio de j sino fuera, puesto que indica las e0ecuciones del bucle interno para cada i
dado. 1odemos resolver t(n, usando apro$imaciones a los sumatorios mediante integrales
donde convenga.


+ + + + + + +

,
_

+ + +
n
i
n
i
i
p
i
p
i
j
n
i
i i i i n p i i n p i n t
1
2
1 1
2
1 1 1
) 2 / ) 1 ( 2 2 ( 1 ) 2 2 ( 1 2 2 1 1 ) (
2




+ + + + + + + + + + + + +
n
i
n n
n
i
n
i
n n n di i di i n i i n i i i n
1
4 3
0
3
0
2
1
3 2
1
2 3 2
4 / 1 3 1 3 1 ) 2 ( 1
"n definitiva, podemos afirmar que t(n n
=
!, t(n on
=
W=!, de lo cual podemos concluir
que t(n n
=
! y t(n *n
=
!.
Se podr5a Daber obtenido una cota superior y otra inferior suponiendo que la condici#n
siempre fuera cierta o falsa, respectivamente. "stas suposiciones nos permitir5an llegar,
respectivamente, a las cotas t(n *n
&
!, y t(n n
O
!, las cuales, como se pueden ver,
son correctas aunque no muy precisas.
:. "n el problema del empaquetamiento en recipientes tenemos n ob0etos de pesos ./, .0,
Z, .n, y un n%mero ilimitado de recipientes con capacidad m$ima R siendo .i T R,
para todo i!. Gos ob0etos se deben meter en los recipientes sin partirlos, y sin superar
su capacidad m$ima. Se busca el m5nimo n%mero de recipientes necesarios para
colocar todos los ob0etos. 1odemos intentar resolver el problema mediante algoritmos
voraces con un esquema como el siguiente:
mientras no se Dayan metido todos los ob0etos en recipientes acer
Seleccionar un ob0eto seg%n cierto criterio
2ntentar meterlo en alguno de los recipiente ya usados
Si cabe en alguno de ellos, meterlo
Si no cabe en ninguno de ellos, usar un nuevo recipiente
,inmientras
'omprobar que el algoritmo no es #ptimo usando los siguiente criterios de selecci#n de
los ob0etos: a! primero los ob0etos con menos peso, b! primero los ob0etos con ms
peso, c! primero el ob0eto ms pesado, luego el menos pesado, el :[ ms pesado, el :[
menos pesado, y as5 sucesivamente.
Solucin:
Ga demostraci#n de que los anteriores mPtodos no funcionan se puede Dacer mediante
contrae0emplos.
a! Sea n9 =, R9 1BB, .9 1, 1, AA, AA!
"st claro que la soluci#n #ptima es usar : recipientes, metiendo en ambos 1, AA!.
1ero el criterio a! introduce primero los ob0etos menos pesados, con lo que la
soluci#n usa O recipientes, metiendo en uno 1, 1! y en los otros AA!, AA!.
b! "ste criterio funciona me0or en mucDos casos, aunque tampoco es #ptimo. 1or
e0emplo, sea n9 >, R9 1BB, .9 >B, OO, OO, OO, :B, :B!
Ga soluci#n #ptima usa : recipientes, con >B, :B, :B! y OO, OO, OO!. 1ero el criterio
b! necesita O recipientes, que se llenan as5: >B, OO!, OO, OO, :B!, :B!.
c! Sea n9 =, R9 1B, .9 &, O, ?, =!
)uevamente la soluci#n #ptima usa : recipientes: &, =!, ?, O!. "l algoritmo voraF
con el criterio c! usar5a O recipientes: &, O!, ?!, =!.
O. )os vamos de compras al mercado. Tenemos ( euros en el bolsillo y una lista de m
productos que podemos comprar. 'ada producto tiene un precio, pi que ser siempre
un n%mero entero!, y una utilidad, ui. De cada producto podemos comprar como
m$imo O unidades. Adems, tenemos una oferta seg%n la cual la segunda unidad nos
cuesta 1 euro menos, y la tercera : euros menos. Queremos elegir los productos a
comprar, ma$imiFando la utilidad de los productos comprados. -esolver el problema
mediante un algoritmo de bacXtracXing. "scribir y e$plicar el esquema que se esco0a de
los vistos en clase y e$plicar c#mo es la representaci#n de la soluci#n, la forma del
rbol, y programar las funciones genPricas del esquema.
Solucin:
'ada producto podemos no comprarlo, comprar una unidad, dos o tres, por lo que la
soluci#n se representar mediante una tupla s 9 s/, s0, 111, sm!, siendo cada si 9 B, 1, : # O.
'on esto tenemos un rbol de soluciones =Cario, donde en el nivel i se decide cuntas
unidades se compran del producto iCPsimo. Ga inicialiFaci#n ser s 9 C1, C1, ..., C1!. 'omo
queremos optimiFar la utilidad llevaremos una variable utilidad donde iremos a(adiendo la
utilidad de los ob0etos que compramos, y que inicialmente estar a B. "l problema es de
optimiFaci#n, por lo que utiliFamos variables au$iliares para la soluci#n #ptima y su valor, y
la condici#n de fin es volver al nodo ra5F. "n &oa guardamos el valor de utilidad para la
soluci#n #ptima en cada momento, y como estamos en un problema de ma$imiFar se
inicialiFa a C. "n un array soa del mismo tipo que s guardamos la soluci#n #ptima en cada
momento, y lo podemos inicialiFar a \1, como el array soluci#n. Al tener una restricci#n
seg%n el precio, usaremos una variable precio que contendr el precio total de los ob0etos
que Demos comprado, y la compararemos con el n%mero de euros ( para comprobar si la
compra es vlida. Gas funciones bsicas del esquema ser5an las siguientes:
operacin 2nicialiFar
voa:9 C
utilidad:9B
precio:9B
nivel:9 1
s:9 C1, C1, ..., C1!
soa:9 C1, C1, ..., C1!
operacin ]enerar nivel, s, precio, utilidad!
sMnivelNLL
si sMnivelNB entonces
precio:9 precio L pMnivelN C sMnivelN L
1
utilidad:9 utilidad L uMnivelN
,insi
operacin Soluci#n nivel, s, precio!
de%ol%er nivel99m! ; precio^9V!
operacin 'riterio nivel, s, precio!
de%ol%er nivel^m! ; precio^9V!
operacin +asEermanos nivel, s!
de%ol%er sMnivelN ^ O
operacin -etroceder nivel, s, precio,
utilidad!
precio:9 precio \ O_pMnivelNLO
utilidad9 utilidadCO_uMnivelN
sMnivelN:9 C1
nivel:9 nivel C 1
'on estas funciones, y suponiendo el esquema de ma$imiFaci#n visto en clase, el algoritmo
est ya completamente definido. 1odr5amos me0orar un poco la eficiencia, Daciendo una
poda ms e$Daustiva, por e0emplo, basada en la funci#n ob0etivo: si la utilidad actual ms
la de los productos que quedan por tratar es menor que el #ptimo actual, podar el nodo.
"sto se puede conseguir con una simple modificaci#n de la funci#n criterio:
operacin 'riterio nivel, s, precio, utilidad!
de%ol%er nivel^m! ; precio^9V! ; utilidadLma$utilMnivelL1N ^9 voa!
donde ma%util es un array donde se Da almacenado la m$ima utilidad que se podr5a
alcanFar te#ricamente a partir de cada nivel. 1or e0emplo, si las utilidades son =,O,&,:!, el
array ma$util es =:,OB,:1,>!. "stas utilidades m$imas se obtendr5an suponiendo que los
niveles no tratados de s se rellenan con valor O.
=. -esolver el problema del e0ercicio O mediante un algoritmo de ramificaci#n y poda.
"$plicar c#mo es la representaci#n de la soluci#n, la forma del rbol, etc., detallando
suficientemente lo referido a las estrategias aplicadas.
Solucin:
Gas cotas en un nodo tienen que serlo de una soluci#n #ptima a partir del nodo. A partir de
cualquier nodo que cumpla las restricciones Day alguna soluci#n al menos la que
corresponde a no comprar ning%n producto ms!, por lo que la poda se puede realiFar
desde el principio y se poda un nodo nodo cuando 'Snodo!^m$imo de las '2nodos
generados!.
'omo '2 en un nodo se puede tomar el valor de la variable utilidad del problema anterior.
*tra '2 me0or ser5a sumar a la utilidad el resultado de un avance rpido con las condiciones
de ese nodo: '2nodo) 9 utilidad L A-ni&el, (Cprecio!. "l avance rpido podr5a consistir en
tener los productos ordenados de mayor a menor utilidad"precio y comprar todos los que se
pueda Dasta un m$imo de tres! de los primeros productos mientras no se gaste todo el
dinero no considerar5amos las reba0as, con lo que ser una versi#n del problema de la
mocDila BW1!.
Ga cota superior puede ser sumar a la utilidad que llevamos la de cada uno de los productos
que quedan por decidir sobre ellos: 'Snodo! 9 utilidad L uMni&elL1N L...L uMmN. "l
problema es una versi#n del de la mocDila donde tenemos tres ob0etos por cada uno de los
productos, con un beneficio que es la utilidad!, un peso que es el precio! y una capacidad
de la mocDila que es el dinero de que disponemos!8 por tanto, podr5amos utiliFar para
calcular la cota superior un avance rpido no BW1, pero restando : al precio de cada ob0eto
si alguno es menor o igual que dos se le pone precio B!. As5 'Snodo) 9 utilidad L
A-noB1modificadoni&el, (Cprecio!.
Ga estimaci#n del beneficio puede igual que siempre! coincidir con la cota superior o la
inferior, o tomarse la media de las dos. "n este caso, ser5a me0or apro$imarla con alguno de
los dos mPtodos de avance rpido considerados, ya que de ese modo obtenemos una
soluci#n que debe estar cercana a la #ptima. Si las dos cotas se calculan con avance rpido
tomar como estimaci#n la media de las cotas ser5a una buena opci#n.
-L./R0T&/S 1 2STR3"T3R-S 42 4-T/S) 25 .2ST06N
P-RT2 #7: 2STR3"T3R-S 42 4-T/S) S2PT02&BR2 2889
1. "n un rbol , de orden p 9 & se insertan las claves 1, :, O, ..., n, en ese mismo orden.
`QuP claves originan la divisi#n de un nodoa `QuP claves Dacen que la altura del rbol
creFcaa .ustificar la respuesta mostrando varios e0emplos de rboles , con diferentes
alturas. A la vista del resultado, `se puede generaliFar el comportamiento para un rbol
, de orden p cualquieraa (2$: puntos)
Solucin:
Ga particularidad de este caso es que, al venir las claves en orden creciente, la inserci#n
siempre se realiFar en la Do0a ms a la derecDa del rbol. "sto implica que el rbol se llena
y va creciendo en altura de la forma ms rpida posible. Siendo el rbol , de orden p 9 &,
en cada nodo caben = claves, as5 que la primera divisi#n de un nodo se producir para el &[
elemento. "s fcil ver que las siguientes se producirn para los elementos @, 11, 1=, 1?, ...,
:LO;, para cualquier ;UB.
"n general, para un p cualquiera, despuPs de la %ltima partici#n la Do0a ms a la derecDa
tendr pW:] claves, y para que se produFca la siguiente partici#n se necesitarn otras pW:1
claves ms. 1or lo tanto, las particiones se producirn en los elementos pW:]LpW:1 ;.
"n cuanto a las claves que originan un incremento de la altura, se puede prever que
ocurrirn con crecimiento e$ponencial. "l primer valor que provoca aumento de altura es el
&, despuPs el 1?, y despuPs el &O. "n general, tras el aumento, el rbol tiene el m5nimo
n%mero de nodos posible para esa altura. "n definitiva, se trata de calcular el m5nimo
n%mero de claves para un rbol , de orden & y altura el peor caso de rbol ,, es decir,
cuando los nodos estn llenos Dasta la mitad!. "ste rbol tendr 1 clave en la ra5F, = en el
segundo nivel, =YO en el tercero, =YO
:
en el cuarto, =YO
O
en el siguiente, y as5 sucesivamente,
puesto que en cada nivel Day O veces ms claves que en el anterior. 1or lo tanto, el n%mero
m5nimo de claves ser:
1 3 2
2
1 3
4 1 3 4 1 3 4 1
1
0
1
0

,
_


+ + +
+


k
k
i
k
i
k
i
i
para ;bB. "sos mismos n%meros son los elementos que provocan el incremento de altura.
=. Suponer que estamos traba0ando con los tipos de datos 2r'ol)rie y Nodo)rie, con
operaciones como las vistas en clase: (2$<: puntos)
Inserta var n: )odoTrie8 c: carcter8 ptr: 1unteroM)odoTrieN!
Consulta n: )odoTrie8 c: carcter!: 1unteroM)odoTrieN
2nula var n: )odoTrie!
)omaNue&o var n: )odoTrie8 c: carcter!
/sando estas operaciones, escribe una operaci#n que dado un rbol trie t, una palabra
p y un entero n, escriba todas las palabras del rbol que empieFan por p y sean de
longitud n. Ga cabecera de la funci#n es de la forma:
MuestraPala'ras t: )odoTrie8 p: cadena8 n: entero!
/sa las operaciones sobre cadenas que se consideres necesarias.
Solucin:
Suponemos que disponemos de las operaciones: HLI para concatenar un carcter a una
cadena8 longitudc!, que devuelve la longitud de la cadena c8 y podemos acceder al carcter
iCPsimo de la cadena c con cMiN.
operacin &uestraPalabras (t: NodoTrie; p: cadena; n: entero)
%ar au$: )odoTrie
au$:9 t
para i:9 1, ..., longitudp! acer
au$:9 'onsultaau$, pMiN!
si au$ 99 )/G* entonces
acabar "" No e%iste la cadena p en el trie
,inpara
+uestraTodas au$, p, nClongitudp!!
operacin &uestraTodas (t: NodoTrie; pre,i!o: cadena; lon=: entero)
%ar au$: )odoTrie
si 'onsultat, J! K )/G*! A)D long 99 B! entonces
escribir prefi0o!
sino si long U B entonces
para c:9 cAc, ..., cdc acer
au$:9 'onsultat, c!
si au$ K )/G* entonces
+uestraTodas au$, prefi0oLc, longC1!
,inpara
,insi
&. "n el algoritmo para encontrar el flu0o m$imo en un grafo dirigido con pesos, se
buscan sucesivos caminos desde el nodo origen s al nodo final t, conocidos como
caminos crecientes. Suponer que el grafo del problema, 3, y el grafo de flu0os
resultantes, 4, se almacena en sendas matrices de adyacencia, 2 y B, de M1..n, 1..nN
con los pesos de las aristas correspondientes. "scribir un algoritmo para encontrar un
camino creciente en el grafo, que devuelva el flu0o m$imo que puede pasar por ese
camino y que actualice los grafos 2 y B de forma adecuada. (2$<: puntos)
Solucin:
Ga forma ms sencilla de obtener un camino creciente o, en general, un camino cualquiera!
es arrancar una ,11 en s. 'uando la ,11 llegue a t ya tenemos un camino en la pila de
llamadas recursivas. "l flu0o que pasa por ese camino ser el m5nimo de los valores de las
aristas del mismo. 1or simplicidad, suponemos que A y , son variables globales, A, ,:
arra' M1..n, 1..nN de entero. Suponemos tambiPn los arrays globales marca: arra' M1..nN
de booleano, y camino: arra' M1..nN de entero, donde iremos almacenando el camino
parcial actual en la ,11.
operacin Busca"amino"reciente (s$ t: entero)
para i:9 1, ..., n acer
marcaMiN:9 QAGS"
,pps, 1, , t!
operacin Bpp (%$ numNodos$ cantidad>lu!o$ ,in: entero)
marcaMvN:9 T-/"
caminoMnum)odosN:9 v
si v 99 fin entonces "" *e !a encontrado un camino creciente
para i:9 1, ..., num)odosC1 acer
AMcaminoMiN, caminoMiL1NN:9 AMcaminoMiN, caminoMiL1NN C cantidad ""
Restar en 3
,McaminoMiN, caminoMiL1NN:9 ,McaminoMiN, caminoMiL1NN L cantidad ""
*umar en 4
AMcaminoMiL1N, caminoMiNN:9 AMcaminoMiL1N, caminoMiNN L cantidad ""
2rista para
"" permitir des!acer caminos (necesaria para +ue el alg1 sea
$ptimo
,inpara
sino
para i:9 1, ..., n acer
si marcaMiN 99 QAGS"! A)D AMv, iN U B! entonces
,ppi, num)odosL1, mincantidadQlu0o, AMv, iN!, fin!
,inpara
,insi
>. Suponer que tenemos las especificaciones formales algebraicas de los TAD Natural y
2r'olBinario5)6, con las siguientes operaciones: (2 puntos)
N9Natural: cero, sucesor, esCero, suma, resta.
292r'olBinario5)6: crear devuelve un rbol vac5o!, construir dados los parmetros
(t, a/, a0, donde t es de tipo ), a/ y a0 de tipo 2, crea un rbol en el que t es la ra5F,
y a/ y a0 los subrboles iFquierdo y derecDo, respectivamente!.
"scribir la semntica de las siguientes operaciones:
a) cuentaVeces: 2 % ) N
cuentaVeces(a, t devuelve un entero que indica el n%mero de veces que aparece el
elemento t en el rbol a. Se supone que disponemos de la operaci#n esIgual para
comparar dos elementos de tipo ).
b) +uitaRaz: 2 2
+uitaRaz(a devuelve un rbol con los mismos elementos que el rbol a, e$cepto el de
la ra5F, que es eliminado. Ga nueva ra5F puede ser cualquiera de los otros elementos de
a.
Solucin
c) cuenta?eces: - @ T N
S"+6)T2'A: t, t1, t: T8 a, a1, a: A
cuenta4ecescrear, t! 9 cero
cuenta4ecesconstruirt1, a1, a:!, t:! 9 S2 es2gualt1, t:!
sucesorsumacuenta4ecesa1!, cuenta4ecesa:!!!
< sumacuenta4ecesa1!, cuenta4ecesa:!!
d) AuitaRaBC: - -
quita-a5Fcrear! 9 crear
quita-a5Fconstruirt, crear, a!! 9 a
quita-a5Fconstruirt1, construirt:, a1, a:!, a!! 9 construirt:, quita-a5Fconstruirt:, a1,
a:!!, a!
-L./R0T&/S 1 2STR3"T3R-S 42 4-T/S) 25 .2ST06N
P-RT2 27: 2STR3"T3R-S 42 4-T/S) S2PT02&BR2 2889
1. /n algoritmo de divide y vencers descompone un problema de tama(o n en tres
subproblemas de tama(o nW: y cuatro subproblemas de tama(o nW=. Ga divisi#n y
combinaci#n requieren =n
:
, y el caso base n7 *tro algoritmo resuelve el mismo
problema, tambiPn con divide y vencers, pero en este caso usando un subproblema de
tama(o nCO y dos de tama(o nC:. "l tiempo de la divisi#n y combinaci#n es
despreciable y el caso base es de orden constante. "n ambos algoritmos el caso base se
aplica con n menor que &.
a! 'alcula el orden de comple0idad de cada uno de los dos anteriores algoritmos. `'ul
es preferible en cuanto a orden de comple0idada (2 puntos)
b! Suponer que los dos algoritmos anteriores usan - bytes de memoria en cada
llamada recursiva para almacenar parmetros, variables locales, direcci#n de
retorno, etc., en la pila!, siendo - una constante. 'alcular la utiliFaci#n de memoria
de los algoritmos. `'ul es preferible respecto al uso de memoriaa (# punto)
Solucin:
a! : puntos!
Seg%n el enunciado, las ecuaciones de recurrencia de los dos algoritmos, que llamaremos t1
y t:, son las siguientes:
t1n! 9 nS Si n ^ &

2
1 1
3 ) 4 / ( 4 ) 2 / ( 3 n n t n t + + Si n U =
t:n! 9 c Si n ^ &
) 3 ( ) 2 ( 2
2 2
+ n t n t Si n U =
-esolviendo ambas ecuaciones de recurrencia, por el mPtodo de la ecuaci#n caracter5stica,
podemos obtener el resultado buscado.
t1n! 9 c1 n
:
L c: n
:
log: n L cO C1!
log:n
*n
:
log n!
t:n! 9
n
n n
c c c ) 1 (
2
5 1
2
5 1
3 2 1
+

,
_

,
_

+
*1,>:
n
!
'laramente el segundo algoritmo tiene un orden de comple0idad mayor, por lo que ser5a
preferible el primero.
b! 1 punto!
"n este caso, las ecuaciones de recurrencia, que llamaremos m1 y m:, son las siguientes:
m1n! 9 X L m1nW:!, con caso base m1n! 9 X si n^&
m:n! 9 X L m:nC:!, con caso base m:n! 9 X si n^&
1ara resolver las ecuaciones podemos aplicar una simple e$pansi#n de recurrencias, puesto
que s#lo aparece un tPrmino recurrente. *btenemos los siguientes resultados.
m1n! 9 XYlog: n C 1! *log n!
m:n! 9 XYnW: C 1! *n!
)uevamente, en cuanto al uso de memoria, el primer algoritmo resulta preferible.
:. Disponemos de una serie de ficDeros mpO versiones no piratas! y una ca0a de 'D
v5rgenes con canon! en los que grabarlos. "l problema es que no todos los ficDeros
caben en los discos, y los ficDeros no se pueden partir en troFos. "l ob0etivo es
encontrar una forma de grabar los ficDeros en los discos de manera que se ma$imice el
n%mero de ficDeros grabados. -esolver el problema por bacXtracXing usando el
esquema iterativo visto en clase. 2ndicar c#mo es la representaci#n de la soluci#n y
programar las funciones genPricas del esquema ]enerar, +sEermanos, etc.!. Datos
del problema: n ficDeros con tama(os t/, t0, 111, tn!, m discos, todos ellos con la misma
capacidad -. (2$<: puntos)
Solucin:
operacin 2nicialiFar
voa:9 C
nivel:9 1
s:9 C1, C1, ..., C1!
ocupaci#n:9 B, B, ..., B!
numQicDeros:9 B
operacin ]enerar nivel, s!
sMnivelN:9 sMnivelN L 1
si sMnivelN 99 1 entonces
numQicDeros:9 numQicDeros L 1
ocupaci#nMsMnivelNN:9 ocupaci#nMsMnivelNN L tMnivelN
sino si sMnivelN U 1 entonces
ocupaci#nMsMnivelNN:9 ocupaci#nMsMnivelNN L tMnivelN
ocupaci#nMsMnivelNC1N:9 ocupaci#nMsMnivelNC1N C tMnivelN
,insi
operacin Soluci#n nivel, s!
de%ol%er nivel99n! A)D ocupaci#nMsMnivelNN^9X!
operacin 'riterio nivel, s!
de%ol%er nivel^n! A)D ocupaci#nMsMnivelNN^9X!
operacin +asEermanos nivel, s!
de%ol%er sMnivelN^nivel "" 8jo: e%isten &arias opciones1 Podramos poner:
de&ol&er s5ni&el69m
"" pero se generaran muc!as soluciones e+ui&alentes
operacin -etroceder nivel, s!
si sMnivelNUB entonces
ocupaci#nMsMnivelNN:9 ocupaci#nMsMnivelNN C tMnivelN
numQicDeros:9 numQicDeros C 1
,insi
sMnivelN:9 C1
nivel:9 nivel C 1
"l esquema del algoritmo ser5a e$actamente el mismo que el visto en clase para un
problema de ma$imiFaci#n.
O. Disponemos de una serie de ficDeros mpO versiones no piratas! y una ca0a de 'D
v5rgenes con canon! en los que grabarlos. "l problema es que no todos los ficDeros
caben en los discos, y los ficDeros no se pueden partir en troFos. "l ob0etivo es
encontrar una forma de grabar los ficDeros en los discos de manera que se ma$imice el
n%mero de ficDeros grabados. -esolver el problema por avance rpido mPtodo voraF!
usando el esquema visto en clase. 2ndicar c#mo es la representaci#n de la soluci#n.
Datos del problema: n ficDeros con tama(os (t/, t0, 111, tn, m discos, todos ellos con la
misma capacidad -. (2$2: puntos)
a. "l rbol de aba0o representa el espacio de soluciones en un problema de ma$imiFaci#n.
1ara cada nodo se muestra de iFquierda a derecDa! la cota inferior, el beneficio
estimado y la cota superior. Son soluciones vlidas del problema los nodos Do0a de nivel
O."l problema se resuelve con ramificaci#n y poda, usando la estrategia G'CG2Q*.
+ostrar, para cada paso del algoritmo, la lista de nodos vivos, el valor de la variable
de poda C, los nodos podados y la soluci#n #ptima actual. .ustifica brevemente los
pasos ms destacados de la e0ecuci#n del algoritmo. (2 puntos)
Solucin:
" soa
LN?
(L"DL0>/)
Nodo
estudiado
Nodos
=enerados
"omentarios
: C 1 2nicialiFaci#n del algoritmo
& C :, O, = 1 :, O, =
@ C O, =, &, > : &, >
@ 1: O, =, & > 1:
"mpate a ," entre O y >, se sigue
por el >. Se genera el 1:, pero al
ser soluci#n final no se almacena en
la G)4
@ 1: =, &, ? O ?
A 1O =, & ? 1O
"mpate entre =, & y ?. Se sigue por
el ?
1B 1B = & 1B, 11
"mpate entre = y &. Se sigue por el
&
1B 1B C = C
Al sacar el nodo = se poda, puesto
que 'S=! ^9 '. Se vac5a la G)4,
con lo que acaba el algoritmo
devolviendo como soluci#n el nodo
1B
1
2
12 40
2
3
14 15
3
5
12 18
4
4
10 10
5
8
10 11
6
4
12 12
8
4
7 12
9
7
7 7
10
10
10 10
7
7
10 15
13
9
9 9
14
4
4 4
12
5
5 5
11
7
7 7
15
9
9 9

Vous aimerez peut-être aussi