1.- (25 ptos) Dada la siguiente declaración de lista: struct Tlista

Anuncio
UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA
DEPARTAMENTO DE INFORMÁTICA
Estructura de Datos: Primer Certamen
Nombre Alumno:
EX UMBRA
IN
SOLEM
Primer Semestre, 2008
1.- (25 ptos) Dada la siguiente declaración de lista:
struct Tlista *artículo;
struct articulo { int codigo, cant_pedida;
TLista *sig; }
Se tiene una lista en la que se ha introducido pedidos de artículos según el orden de llegada, por lo que
puede haber varios pedidos del mismo artículo. Se pide escribir una función que, dada una lista como la
anteriormente descrita, devuelva un único elemento por cada artículo, en el cual el campo cant_pedida
tenga la suma de todas las cantidades pedidas de ese artículo.
a.-) Escriba un algoritmo en pseudocódigo sin utilizar estructuras auxiliares, así como tampoco estructuras
de control como while, for o do/while.
b.-) Determine la complejidad en tiempo y espacio del algoritmo en a.-).
Sol.:
a.-)
void Elimina(Tlista *L; int Cod; int *Suma) {
Tlista Aux;
if L !Null
if L->Codigo == Cod {
Aux = L;
Suma = Suma + L->Cant_Pedida;
L = L->Sig;
free(Aux);
Elimina(L, Cod, Suma);
}
else Elimina(L->Sig, Cod, Suma);
}
void Eli_Codigo(Tlista *Lista) {
if Lista !=Null {
Elimina(Lista->Sig, Lista->Codigo, Lista->Cant_Pedida);
Eli_Codigo(Lista->Sig);
}
}
b.-) Elimina es O(n) y Eli_Codigo es O(n).
UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA
DEPARTAMENTO DE INFORMÁTICA
EX UMBRA
IN
SOLEM
2.- (15 ptos.) Suponga que se tiene la siguiente estructura de información:
struct nodo {
int inf;
struct nodo *sig;
}
nodo *q,*r,*s;
nodo T;
Aplicar cada una de las operaciones desde a.-) hasta e.-) siempre a partir del Estado Inicial de la siguiente
figura y completar la configuración resultante en el respectivo dibujo en esta página.
1
r
q
Estado Inicial:
2
3
a) q = q->sig:
1
4
q
2
s
3
5
r
s
4
5
b) q = T;
Primero se debe observar si el tipo de las dos variables es compatible. La asignación es incorrecta
ya que q es un puntero, mientras que T es de tipo nodo.
c) q->sig = q->sig->sig;
1
2
q
r
3
4
s
5
d) q = r->sig;
1
2
e) (1) s->sig = s; (2) T=q;
q
1
s q
r
3
4
(3) *q=*s; (4) *s=T;
5
Asumir T como un nodo cualquiera…
3
5
r
4
s
5
UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA
DEPARTAMENTO DE INFORMÁTICA
EX UMBRA
IN
SOLEM
3.- (15 ptos.) Considerando que el siguiente segmento de código tiene asociado funciones de diferentes órdenes, haga
un análisis desde (1) a (5) para determinar su complejidad.
{
(1) for( i = 0; i < n; i++){O(f(n))}
(2) for( k=0; k < m; k++){O(g(m)}
(3) for( i = 1; i < n-1; i++){
(4) for( j=i+1; j < n; j++){
if (O(1000))
O(100)
else O(log n)
}
}
(5) if (O(cte))
O(n log n)
else O(log n)
}
a.-) Si f(n) = 2n2 + 50 y g(n) = 100n, ¿Cuál es la complejidad en tiempo asociada al código?
b.-) ¿Este comportamiento es válido para todo n? Explique.
a.-)
(1) es O(f(n))
(2) es O(g(m))
(3) es de orden n por el for interno (4)
(4) es O(n log n)
(5) es O(n log n)
La complejidad del código es (1) + (2) + (3) + (5) = O(f(n) + g(m) + n2 log n + n log n) = O(f(n) + g(m) + n2 log n)
Si f(n) = 2n2 + 50 y g(n) = 100n, entonces el código es O(2n2 + 50 + 100m + n2 log n) = O(100m + n2 log n)
b.-) No es válido para todo n. Al tratarse de una función asintótica, muestra el comportamiento para n “grande” y m
“grande”.
UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA
DEPARTAMENTO DE INFORMÁTICA
EX UMBRA
IN
SOLEM
4.- (25 ptos.) Las búsquedas realizadas con un browser en Internet mantienen en una estructura de datos el ranking de
los elementos mas buscados por el navegador. En esta estructura las operaciones que se realizan permanentemente
son:
• Las inserciones de elementos se hacen siempre en la primera posición de la lista, inicializando un contador en
cero.
• La operación de búsqueda modifica la lista de manera que desplaza el elemento buscado a la primera
posición, incrementado el contador en uno.
a.-) Escriba una función que busque un elemento específico y realice la operación mencionada.
b.-) Determine la complejidad en tiempo y espacio de las operaciones.
Sol.:
a.-)
void Busca(TLista *p; TElemento x) {
TElemento temp;
TLista *q = p;
Tlista *r = p;
int Esta = 1;
while ((q != Null) && ( Esta)) {
if(q -> info == x) {
if(p == q)
exit (1);
else {
Esta = 0;
temp = q -> info;
r -> sig = q -> sig;
free(q);
Inserta(p, temp);
}
else {
r = q;
q = q -> sig;
}
}
}
Inserta( TLista * p1, TElemento t) {
TLista * aux;
Pedir_memoria (aux);
aux -> info = t;
aux -> sig = p1;
p1 = aux;
}
b.-) Inserta es O(1), y busca es O(n).
UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA
DEPARTAMENTO DE INFORMÁTICA
EX UMBRA
IN
SOLEM
5.- (20 ptos.) La Empresa de Ferrocarriles del Estado (EFE) para realizar su traslado de pasajeros hacia el Sur, ha ido
apilando los carros respectivos en una línea de tren en una estación; ver figura. La locomotora se toma como un carro
más.
………
Justo antes de salir; su conductor se percata que uno sus carros está defectuoso. Ayúdele a escribir una función para
sacar el carro defectuoso de la línea y dejar los demás carros en el orden que estaban (misma línea), para poder
cumplir con el itinerario previsto. Los carros tienen asignado una sigla. El carro defectuoso tiene asignada la
abreviatura “EFE29”. No se sabe en qué lugar está el carro defectuoso ni tampoco el número de carros del tren.
Sol.:
void Tren(TPila * tope, TElemento cod) {
TPila * tope1;
while ( tope -> info != cod) {
Push(tope1, tope -> info);
Pop(tope);
}
Pop(tope);
while(tope1 != Null) {
Push(tope, tope1 ->info);
Pop(tope1);
}
}
Descargar