EX UMBRA IN SOLEM UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA DEPARTAMENTO DE INFORMÁTICA Nombre: Estructura de Datos: Primer Certamen Segundo Semestre, 2010 1.- (25 ptos.) Calcule la complejidad de los siguientes segmentos de algoritmos: a) i=1; while (i<n) if ( Comprueba(i) ) i++; // Comprueba(i) = O(n); else i*=2 b) long calcula(long numero) if(numero<1) return(1); else return( (5*calcula(numero-3)) – (2*calcula(numero-1)) + calcula(numero-2)); c) for(i=1;i<n;i*3) for(j=n;j>1;j/2) printf(“%d,%d”,i,j); Respuesta: a) O(n2) b) O(3n) c) O(log2n*log3n) 2.- (25 ptos) Se dispone de dos algoritmos según la siguiente tabla: Complejidad espacial Complejidad Temporal Algoritmo1 10n bytes 200n ciclos Algoritmo2 500n bytes 50n ciclos Estos algoritmos se prueban en 2 supercomputadores: Capacidad de memoria Duración de ciclo Supercomputador1 20.000 bytes 10 milisegundos Supercomputador2 50.000 bytes 50 milisegundos Disponibilidad 30 segundos 100 segundos a) Cuantos n alcanza a calcular cada algoritmo con cada uno de estos supercomputadores? b) Si se dispone de almacenamiento infinito, cuantos n alcanza esta vez el algoritmo 2 a calcular en ambas máquinas? c) En ese caso, cuánto espacio utilizaría en total en cada máquina? Respuesta: Supercomputador1 Supercomputador2 Algoritmo1 15 10 Supercomputador1 Supercomputador2 Algoritmo2 60 40 a) b) b) Supercomputador1 Supercomputador2 Algoritmo2 30.000 20.000 Algoritmo2 40 40 UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA DEPARTAMENTO DE INFORMÁTICA EX UMBRA IN SOLEM 3.- (25 ptos.) Una empresa de trenes necesita un programa que arme automáticamente los trenes para cierta cantidad de pasajeros. Se cuenta con una pila de locomotoras, una pila de vagones de carbón y una pila con vagones de pasajeros con una capacidad para 10 pasajeros cada uno. La empresa le suministra un arreglo con la cantidad de pasajeros que se subirán a cada tren y un arreglo de pilas donde se deben dejar los trenes listos para salir y con la capacidad necesaria para transportar a los pasajeros. Las locomotoras y vagones pueden estar listos para el servicio o en mal estado. Los en mal estado deben ser enviados a la pila para enviar al taller. Struct vagon{ Int estado; // 1: Disponible , 0: Mal estado }; Int pasajeros[20]; TPila trenes[20]; TPila locomotoras; TPila vagones_carbon; TPila vagones_pasajeros; TPila Taller; Escriba una función en pseudo-código para procesar el arreglo y generar las pilas de trenes según se requiera. Recuerde enviar los vagones en mal estado al taller y dejar los trenes listos para salir (primer vagón en salir locomotora). Considere las pilas como dinámicas e infinitas. Respuesta: Void ordena(void){ Int Encontrado; Struct vagon temp; Int i,j; For(j=0;j<20;j++){ For(i=0;i<(pasajeros[j]/10+((pasajeros[j]%10)?1,0));i++){ Encontrado=0; While(!Encontrado){ Pop(vagones_pasajeros,temp); If(temp.estado){ Encontrado=1; Push(trenes[i],temp); }else Push(Taller,temp); } } Encontrado=0; While(!Encontrado){ Pop(vagones_carbon,temp); If(temp.estado){ Encontrado=1; Push(trenes[i],temp); }else Push(Taller,temp); } Encontrado=0; While(!Encontrado){ Pop(locomotoras,temp); If(temp.estado){ Encontrado=1; Push(trenes[i],temp); }else Push(Taller,temp); } } } UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA DEPARTAMENTO DE INFORMÁTICA EX UMBRA IN SOLEM 4.- (25 ptos.) Se tiene la siguiente declaración de estructura: struct disco struct nodoLD { int info; struct nodoLD *sig, *ant; }; struct nodoLD * ld ; a) Implemente la operación de InsertarLD(nodoLD *ld, int x) en una lista ordenada. b) Que pasa si la lista está desordenada c) Haga un análisis de la complejidad en ambos casos (a y b). Respuesta: a) Void InsertarLD(nodo *ld, int x){ nodoLD p,nodo; nodo=(nodoLD*)malloc(sizeof(nodoLD)); nodo->info=x; nodo->sig=nodo->ant=NULL p=*ld; if (p==NULL){ *ld=nodo; return; } if (p->info<=x){ while((p->sig!=NULL)&&(p->sig->info<=x)){ p=p->sig; } if (p->sig==NULL){ p->sig=nodo; nodo->ant=p; return; } p->sig->ant=nodo; nodo->sig=p->sig; p->sig=nodo; nodo->ant=p; return; } while((p->ant!=NULL)&&(p->ant->info>x)){ p=p->ant; } if (p->ant==NULL){ p->ant=nodo; nodo->sig=p; return; } p->ant->sig=nodo; nodo->ant=p->ant; p->ant=nodo; nodo->sig=p; } UNIVERSIDAD TÉCNICA FEDERICO SANTA MARÍA DEPARTAMENTO DE INFORMÁTICA EX UMBRA IN SOLEM b) Void InsertarLD(nodo *ld, int x){ nodoLD p,nodo; nodo=(nodoLD*)malloc(sizeof(nodoLD)); nodo->info=x; nodo->sig=nodo->ant=NULL p=*ld; if (p==NULL){ *ld=nodo; return; } if (p->sig==NULL){ nodo->ant=p; p->sig=nodo; return; } nodo->ant=p; nodo->sig=p->sig; p->sig->ant=nodo; p->sig=nodo; } c) A=O(n) B=O(1) u O(n) dependiendo de la implementación