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); } }